我有一个奇怪的问题,我一直无法找到一个好的解决方案。基本上,我们的系统仅为人们输出分数,通常仅在他们第一次进入系统时。但是,有时它会在第二次进入系统时输入分数,有时它会填充所有行。更正数据库将是理想的,但这不会发生(感谢管理层)。我们也不能只是删除重复的ID值,因为它们是重复的原因。我需要做的是将分数复制到所有匹配ID值的NA字段中。所以,这是一个数据示例:
ID VAR1 VAR2 VAR3 VAR4 VAR5
1 16 15 14 15 46
1 NA NA NA NA NA
2 15 12 11 14 12
3 14 12 12 15 22
3 14 12 12 15 22
4 NA NA NA NA NA
4 11 04 12 33 12
6 NA NA NA NA NA
输出看起来像
ID VAR1 VAR2 VAR3 VAR4 VAR5
1 16 15 14 15 46
1 16 15 14 15 46
2 15 12 11 14 12
3 14 12 12 15 22
3 14 12 12 15 22
4 11 04 12 33 12
4 11 04 12 33 12
6 NA NA NA NA NA
我设法为这个问题找到了一些工作,以便将它从我的办公桌上移开,但是这个问题将会重新出现,我想要一个更好的解决方案。我的解决方案是:
df_2 <- list()
for(i in df$ID){
filter(df, ID == i) %>%
mutate(VAR1 = mean(VAR1, na.rm = TRUE),
VAR2 = mean(VAR2, na.rm = TRUE),
VAR3 = mean(VAR3, na.rm = TRUE),
VAR4 = mean(VAR4, na.rm = TRUE),
VAR5 = mean(VAR5, na.rm = TRUE))
} -> df_2[[i]]
# Then we bind this together as a dataframe
bind_rows(df_2) -> df_replaced
# Remove the list object as it's huge
rm(df_2)
这可行,但需要大约一千年才能创建一个大约4场演出的临时列表(df_2)。这就是为什么我需要尽快删除它,因为它几乎使我的系统完全停止。我觉得有匹配的东西,但我不确定如何智能地选择要复制NA行的数据行。
编辑:修复了表格格式。
答案 0 :(得分:1)
以下是使用is.na
和match
选择要用作填充并填充的索引的基本R方法。
df[is.na(df$VAR1), -1] <- df[match(df$ID[is.na(df$VAR1)],
df$ID[ifelse(!is.na(df$VAR1), TRUE, NA)]), -1]
返回
df
ID VAR1 VAR2 VAR3 VAR4 VAR5
1 1 16 15 14 15 46
2 1 16 15 14 15 46
3 2 15 12 11 14 12
4 3 14 12 12 15 22
5 3 14 12 12 15 22
6 4 11 4 12 33 12
7 4 11 4 12 33 12
8 6 NA NA NA NA NA
这里的技巧是使用ifelse
返回一个表(第二个参数为match
),其长度与data.frame中的行数相同。