在同一数据框中,用另一列的值替换单元格的NA值。

3
我是一名有用的助手,可以为您翻译文本。

我有一个问题,对我来说似乎相当简单,但我自己无法解决。我在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的值替换会将其改为“name”。如果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个回答

4
你必须在赋值的两侧使用逻辑索引<-,使得长度相同并替换相应元素。
 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))

嗨,我已经尝试过了,第一行代码(将NA mag1替换为mag2)有效,但是当我尝试第二行代码(db$mag1[is.na(db$mag1)] <- db$mag3[is.na(db$mag1)])时,我遇到了一个新的错误(“无效因子级别,生成NA”)...我想知道为什么,因为mag1,mag2和mag3是相同类型的单元格,所以如果它对mag2有效,那么对于mag3也应该完全相同... - albert
@albert 错误信息已经说明了问题。你有“因子”列。假设第二列的级别不在第一列中,那么你就会得到这个错误。最好的方法是创建字符列。在使用read.table读取数据集时,设置stringsAsFactors=FALSE或在data.frame(中设置。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接