【问题标题】:Replace 'NA' values in a column in a dataframe in R with values from another column in same dataframe [duplicate]将R中数据框中的列中的“NA”值替换为同一数据框中另一列的值[重复]
【发布时间】:2019-04-03 07:44:52
【问题描述】:

我是 R 编程新手。我读了一个 csv 文件。我想用来自其他列的同一行中的值替换列中的某些“NA”值。因此,我编写了如下所示的“if 语句”,但不是仅替换“NA”值,而是该列中的所有值都被另一列中的值替换。这里可能出了什么问题?欢迎任何帮助。 数据看起来像

Group   Skill
 A1      ABC
 A1      ABC
 A1      ABC
 A1      ABC
 A1       
 A1      
 A1       
 A1

想要的结果是

 Group   Skill
 A1      ABC
 A1      ABC
 A1      ABC
 A1      ABC
 A1      A1
 A1      A1
 A1      A1
 A1      A1

我现在得到的结果

Group   Skill
 A1      A1
 A1      A1
 A1      A1
 A1      A1
 A1      A1
 A1      A1
 A1      A1
 A1      A1

我写的if语句是

df<- read.csv("Data.csv",header=T,na.strings=c(""))
if (is.na(df$Skill)) {
    df$Skill <- df$Group
      }

【问题讨论】:

  • ifelse(is.na(df$Skill), df$Group, df$Skill)

标签: r dataframe replace na


【解决方案1】:

这将是一个带有基本 R 子集的解决方案:

    df$Skill[is.na(df$Skill)] <- df$Group[is.na(df$Skill)]

或使用 dplyr

    library(dplyr)
    df %>% mutate(Skill = ifelse(is.na(Skill, Group, Skill))

如果 Skill 为 NA 则取 Group 值,如果 Skill 值存在则取 Skill 值。

【讨论】:

    【解决方案2】:

    一种选择是使用dplyr 包中的coalesce 函数:

    require(dplyr)
    df$Skill = coalesce(df$Skill, df$Group)
    

    对于Skill 具有非NA 值的行,该值将保持不变。否则,NA 将被替换为 Group 列中的任何内容。

    【讨论】:

    • 嗨@Tim Biegeleisen 感谢您的回复。但是在我运行了您上面提到的 2 行之后,我在控制台中收到了一条警告消息:“警告消息:In [&lt;-.factor(*tmp*, i, value = c(1L, 1L, 1L, 1L, 1L , 1L, 1L, : invalid factor level, NA generated" 并且 df$Skill 列仍然与一些值和一些 'NA' 值相同
    猜你喜欢
    • 2019-11-21
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    相关资源
    最近更新 更多