在同一数据帧中覆盖具有匹配ID值的行

时间:2016-12-14 18:34:51

标签: r

我有一个奇怪的问题,我一直无法找到一个好的解决方案。基本上,我们的系统仅为人们输出分数,通常仅在他们第一次进入系统时。但是,有时它会在第二次进入系统时输入分数,有时它会填充所有行。更正数据库将是理想的,但这不会发生(感谢管理层)。我们也不能只是删除重复的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行的数据行。

编辑:修复了表格格式。

1 个答案:

答案 0 :(得分:1)

以下是使用is.namatch选择要用作填充并填充的索引的基本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中的行数相同。