R将单元格的NA值替换为同一数据帧中另一列的值

时间:2014-12-18 14:34:44

标签: r replace cell na

我有一个问题,在我看来很简单,但我不能自己解决这个问题。我已经在stackoverflow上寻求解决方案,我想它已经被某人解决了但我还没有找到它。

我有一个基于5个数据帧合并的数据框,看起来像这样:

id | mag1 | mag2 | mag3
1 | name | name | name
2 | NA | NA | name
3 | NA | name | NA

使用mag2和mag3时,总会有一个填充的名称(mag1,mag2和mag3中没有NA的行)。我想更改mag1的值,以便它永远不会为空,并且它将获取下一个非空单元格的值。

我想过要使用这种代码:

db$mag1[is.na(db$mag1)] <- db$mag2
db$mag1[is.na(db$mag1)] <- db$mag3

使用此代码,在我看来,例如,在第二行中,使用db $ mag2的值替换将使mag1保持不变(NA)并且使用db $ mag3的替换将其值更改为& #34;名称&#34 ;.如果mag2中存在非NA值,则不应激活第二行。

现在,这是我得到的错误:

Warning message:
In db$mag[is.na(db$mag1)] <- db$mag2 :
   number of items to replace is not a multiple of replacement length

我猜我的代码行中有一个非常简单的错误,但我没有设法看到它。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您必须在作业<-的两侧使用逻辑索引,以便lengths相同并替换相应的元素。

 db$mag1[is.na(db$mag1)] <- db$mag3[is.na(db$mag1)]
 db
 #  id mag1 mag2 mag3
 #1  1 name name name
 #2  2 name <NA> name
 #3  3 <NA> name <NA>

数据

 db <- structure(list(id = 1:3, mag1 = c("name", NA, NA), mag2 = c("name", 
 NA, "name"), mag3 = c("name", "name", NA)), .Names = c("id", 
 "mag1", "mag2", "mag3"), class = "data.frame", row.names = c(NA, 
 -3L))