【问题标题】:Replacing empty cells in a column with values from another column in R用R中另一列的值替换列中的空单元格
【发布时间】:2020-06-16 16:12:20
【问题描述】:

我正在尝试将单元格值从 StudyID 列拉到空单元格 SigmaID 列,但我在输出时遇到了一个奇怪的问题。

这是我的数据在运行命令之前的样子。

StudyID    Gender  Region  SigmaID
LM24008      1       20    LM24008  
LM82993      1       16    LM28888  
ST04283      0       44      
ST04238      0       50      
LM04829      1       24    LM23921  
ST91124      0       89
ST29001      0       55

我尝试通过以三种方式编写语法来完成此操作,因为我不确定逻辑的设置方式是否存在问题。所有三个产生相同的输出。

df$SigmaID <- ifelse(test = df$SigmaID != "", yes = df$SigmaID, no = df$StudyID)

df$SigmaID <- ifelse(df$SigmaID == "", df$StudyID, df3$SigmaID)

df %>% mutate(SigmaID = ifelse(Gender == 0, df$StudyID, df$SigmaID)

输出:它不是从 StudyID 列中提取值,而是填充一到四位数字。

StudyID    Gender  Region  SigmaID
LM24008      1       20    LM24008  
LM82993      1       16    LM28888  
ST04283      0       44    5  
ST04238      0       50    4908  
LM04829      1       24    LM23921
ST91124      0       89    209
ST29001      0       55    4092

我尝试将空格重新编码为 NA,然后在逻辑中调用 NA,但这会产生与上面看到的相同的输出。我想知道它是否与变量类型或变量属性有关,以及它如何读取 StudyID 中的字符。非常感谢您对此问题的反馈!

【问题讨论】:

    标签: r missing-data


    【解决方案1】:

    这是怎么做的:

    df$SigmaID[df$SigmaID == ""] = df$StudyID[df$SigmaID == ""]
    

    df[df$SigmaID == ""] 仅选择 SigmaID=="" 所在的行

    我还建议使用data.table 而不是data.frame。它速度更快,并且有一些有用的语法特性:

    library(data.table)
    setDT(df) # setDT converts a data.frame to a data.table
    df[SigmaID=="",SigmaId:=StudyID]
    

    【讨论】:

      【解决方案2】:

      跟进此事!事实证明,默认 R 将字符串类型转换为因子。有几种方法可以解决上述问题。

      i <- sapply[df, is.factor]
      df[i] <- lapply(df[i], as.character)
      

      另一种方法:

      df <- read.csv("/insert file pathway here", stringAsFactors = FALSE)
      

      这是我发现有帮助的!我相信还有其他方法可以解决此问题。

      【讨论】:

        猜你喜欢
        • 2015-11-21
        • 2019-12-04
        • 2020-06-21
        • 2016-03-08
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 2022-06-23
        相关资源
        最近更新 更多