我是一个长期潜伏在论坛上的人,也是第一次发帖.对于我帖子中的任何不足之处,我提前表示歉意.这是一个相当复杂的问题.
描述:
我有一个从各种来源收集的科学怪人数据集.它包含一组不一致的公司ID变量,总共18个.假设我对一家公司有5个观察;我可能有2个、2个、10个或16个标识符.有一些重叠;其余的都不见了(NA
).我想收回丢失的ID,所以我理想的情况是有18、18、18、18、18或16个,这取决于我对每家公司的覆盖范围.
问题描述: 现在,这是一个面板数据集,它增加了额外的复杂性.公司合并,移动,并随着时间的推移改变法律状态.并非所有的ID变量都将以相同的方式处理这些变量,因此ID变量的ID代码可能会根据观察时间而变化.我想过滤掉这些情况,因为我不能确定要使用的正确ID.
方法: 我已经try 遍历每个变量的数据(假设我可以在填充空格时 Select 几个额外的匹配项).我按每个ID变量对观察值进行分组,并确定每个变量有多少不同的观察值.如果对任何相应的ID变量有超过1个不同的观察,我认为存在冲突.如果只有1,我假定没有冲突,并试图填充缺失的值.然而,我的代码似乎不能正确循环,丢失了可能会出错的数据.
Sample Data:
### Not ID 1 should be imputable while ID 2 should not
data <- data.frame(ID = c(1, 1, NA, 2, NA, 2, 2, 2)
ID_Variable_1 = c(10, 10, NA, 20, 20, 20, 19, 18),
ID_Variable_2 = c(NA, 8, 8, 16, 16, 16, NA, NA),
ID_Variable_3 = c(NA, 8, 8, NA, 10, NA, NA, NA)
ID_Variable_4 = c(A10, NA, NA, NA, NA, B12, B12, B12)
Current attempt:
### Extract vector of variables names
column_vector <- names(data)
### Set Function to impute data
Impute_missing_data <- function(data, column_vector){
#### Back-up data
temp_data <- data
#### Loop through each variable
for (i in column_vector) {
#### Identify unique ID combinations, filter out those which contain conflicts
imputation_candidates <- temp_data %>%
group_by_at(vars(i)) %>%
summarise(across(everything(), ~ n_distinct(., na.rm = TRUE))) %>%
filter(if_all(-i, ~ . <= 1), .preserve = TRUE)
#### Copy vector of IDs with imputable data
imputation_applying <- imputation_candidates\[\[i\]\]
#### Update temporary data with imputable data. As all IDs are the same update based on the first non-NA
temp_data <- temp_data %>%
group_by_at(vars(i)) %>%
mutate(across(everything(), ~ ifelse(.x %in% imputation_applying & is.na(.), first(.x[!is.na(.x)]), .x))) %>% ungroup()
}
#### Return updated data
return(temp_data)
}
Desired Output:
data_temp <- data.frame(ID = c(1, 1, 1, NA, 2, NA, 2, 2, 2)
ID_Variable_1 = c(10, 10, 10, 11, 20, 20, 20, 19, 18),
ID_Variable_2 = c(8, 8, 8, ,12, 16, 16, 16, NA, NA),
ID_Variable_3 = c(8, 8, 8, NA, NA, 10, NA, NA, NA)
ID_Variable_4 = c(A10, A10, A10, NA, NA, NA, B12, B12, B12)