【问题标题】:R: How to replace elements of a data.frame?R:如何替换 data.frame 的元素?
【发布时间】:2011-02-15 13:40:25
【问题描述】:

我正在尝试用“NULL”替换包含“#N/A”的 data.frame 的元素,但遇到了问题:

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8))

indices_of_NAs <- which(foo == "#N/A") 

replace(foo, indices_of_NAs, "NULL")

[&lt;-.data.frame(*tmp*, list, value = "NULL") 中的错误: 新列会在现有列之后留下孔

我认为问题在于我的索引将 data.frame 视为向量,但替换函数以某种方式对其进行了不同的处理,但我不确定问题是什么?

【问题讨论】:

    标签: r replace dataframe


    【解决方案1】:

    为什么不

    x$col[is.na(x$col)]<-value
    

    ?
    您不必更改数据框

    【讨论】:

      【解决方案2】:

      NULL 真的意味着“什么都没有”,而不是“缺失”,因此它不能代替实际值 - 因为缺失的 R 使用 NA。

      您可以使用 is.na 的替换方法直接更新选定的元素,这将具有逻辑结果。 (使用 which 索引只能与 is.na 一起使用,直接使用 [ 调用列表访问,这是您的错误的原因)。

      foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 
      NAs <- foo == "#N/A"
      
      ## by replace method
      is.na(foo)[NAs] <- TRUE
      
       ## or directly
       foo[NAs] <- NA
      

      但是,当使用 c() 创建 od 列时,您已经通过强制强制处理了 od 列中的字符串(实际上是一个默认因素),并且您可能需要单独处理列。例如,任何数字列都不会匹配字符串“#N/A”。

      【讨论】:

      • 例如,“任何数字列都不会与字符串“#N/A”匹配。”是什么意思?如何查看我正在查看的列类型?
      • 不错的解决方案。在用 NA 替换值后,如何使列重新解释为数字?我有几十列,很难分辨哪些列的 NA 值发生了变化。
      【解决方案3】:

      replace 函数需要一个向量,而您提供的是一个 data.frame。

      您确实应该尝试使用NANULL 而不是您当前使用的字符值。否则,您将无法利用 R 的所有功能来处理缺失值。

      编辑

      你可以使用一个 apply 函数,或者做这样的事情:

      foo <- data.frame(day= c(1, 3, 5, 7), od = c(0.1, NA, 0.4, 0.8))
      idx <- which(is.na(foo), arr.ind=TRUE)
      foo[idx[1], idx[2]] <- "NULL"
      

      在这种情况下,您不能分配真正的 NULL 值,因为它的长度为零。了解NANULL之间的区别很重要,所以我建议你阅读?NA?NULL

      【讨论】:

      • 谢谢 Shane,您是否建议我将我的 data.frame 转换为矢量,执行该功能,然后将其转换回 data.frame?我会使用你建议的数据格式。
      猜你喜欢
      • 2021-12-10
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      相关资源
      最近更新 更多