我有一个在我看来很简单的问题,但我无法自己解决。我已经在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的替换将其值更改为“名称”。如果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
我想我的代码行中有一个非常简单的错误,但我看不到它。任何想法?
最佳答案
您必须在分配<-
的两侧都使用逻辑索引,以便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))