【问题标题】:Replace the NA value of a cell by the value of another column in the same dataframe将单元格的 NA 值替换为同一数据框中另一列的值
【发布时间】:2015-02-17 09:08:19
【问题描述】:

我有一个问题,在我看来很简单,但我无法自己解决。我在 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

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

【问题讨论】:

    标签: r dataframe replace na


    【解决方案1】:

    您必须在赋值&lt;- 的两边使用逻辑索引,这样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))
    

    【讨论】:

    • 嗨,我试过了,它适用于第一行代码(用 mag2 替换 NA mag1)但是当我尝试第二行时(db$mag1[is.na(db$mag1 )]
    • @albert 错误说明了一切。您有 factor 列。假设第二列的级别不在第一列,您将收到该错误。最好的方法是创建字符列。当您使用read.table 读取数据集时,设置stringsAsFactors=FALSEdata.frame(
    猜你喜欢
    • 2019-11-21
    • 2019-04-03
    • 2017-01-14
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2018-11-17
    相关资源
    最近更新 更多