R:如何根据分组填写列中的NA值?

时间:2017-10-19 21:30:59

标签: r dplyr

我希望将此示例数据框中的NA值替换为“A”或“B”,具体取决于其“第二”列类别:(A代表A1,B代表B1)

df <- data.frame(first = c("A","A",NA,NA,"B",NA,NA,NA),second = c(rep("A1",4),rep("B1",4)))
df
  first second
1     A     A1
2     A     A1
3  <NA>     A1
4  <NA>     A1
5     B     B1
6  <NA>     B1
7  <NA>     B1
8  <NA>     B1

这就是我希望结果数据框看起来像:

  first second
1     A     A1
2     A     A1
3     A     A1
4     A     A1
5     B     B1
6     B     B1
7     B     B1
8     B     B1

我试过这个解决方案,但显然它不起作用:

df$first[is.na(df$first)] <- unique(df[!is.na(df$first),"first"])

我觉得可能有一个dplyr解决方案,但无法想到它。

谢谢!

1 个答案:

答案 0 :(得分:1)

无需dplyr。这应该在基础R中起作用:

df$first[is.na(df$first)] <- gsub("(\\w)\\d", "\\1", df$second[is.na(df$first)])

说明:gsub通过匹配来自first的[letter] [数字]并替换为[letter],将second中的NA条目替换为来自second的条目。

  first second
1     A     A1
2     A     A1
3     A     A1
4     A     A1
5     B     B1
6     B     B1
7     B     B1
8     B     B1