【问题标题】:R: Convert characters to numeric in data.frame with unknown column classesR:将字符转换为具有未知列类的data.frame中的数字
【发布时间】:2018-06-15 08:32:57
【问题描述】:

在这个 SO here 中有一个关于如何将字符转换为数字的很好的讨论。 也许我在那篇文章中遗漏了一些东西,但是如果一个人不知道哪些列是“可转换的”(如果有的话)该怎么办? 是否可以检查可转换性? 另外,我通常抑制因子转换(像字符更好) - 所以字符应该是字符(而不是因子)。

df <- data.frame(a=as.character(c(NA, 1/3)), b=letters[1:2], c=c('1|2', '4|2'), d=as.character(3:4), stringsAsFactors = F)

然后应用...一些函数f ...得到:

str(f(df))
'data.frame':   2 obs. of  4 variables:
 $ a: num  NA 0.333
 $ b: chr  "a" "b"
 $ c: chr  "1|2" "4|2"
 $ d: int  3 4

如何为任何事先不知道的 data.frame 实现这一点?

【问题讨论】:

    标签: r dataframe character numeric


    【解决方案1】:

    你可以做这样的事情(虽然不是很优雅)。

    fun1 <- function(i) {
      if (!all(is.na(as.numeric(df[, i])))){
        as.numeric(df[, i])
      } else {
        df[, i]
      }
    }
    
    df1 <- "names<-"(cbind.data.frame(lapply(seq_along(df), fun1),
                                      stringsAsFactors=FALSE), names(df))
    
    > str(df1)
    'data.frame':   2 obs. of  4 variables:
     $ a: num  NA 0.333
     $ b: chr  "a" "b"
     $ c: chr  "1|2" "4|2"
     $ d: num  3 4
    

    或更笼统地说:

    convertiblesToNumeric <- function(x){
      x2 <- cbind.data.frame(lapply(seq_along(x), function(i) {
        if (!all(is.na(as.numeric(x[, i])))){
          as.numeric(x[, i])
          } else {
            x[, i]
            }
        }), stringsAsFactors=FALSE)
      names(x2) <- names(x)
      return(x2)
    }
    
    df1 <- convertiblesToNumeric(df)
    > str(df1)
    'data.frame':   2 obs. of  4 variables:
     $ a: num  NA 0.333
     $ b: chr  "a" "b"
     $ c: chr  "1|2" "4|2"
     $ d: num  3 4
    

    【讨论】:

    • 但是有效。 “names
    • 你也可以在两行代码中完成df1 &lt;- cbind.data.frame(.); names(df1) &lt;- names(df)
    • 尝试?"names&lt;-" 并查看here 以获得一些解释。
    • 也许你的函数——为了完整性——应该允许df的第二个参数当一个data.frame被命名为不同的东西(而不是df)。如fun1 &lt;- function(i, df) {...} 然后调用lapply(seq_along(DF), fun1, df=DF)
    • 这不会按预期工作。更好的是在应用函数之前使用df[] &lt;- sapply(df, as.character) 将所有转换为字符。或者在函数中包含一行 x &lt;- cbind.data.frame(sapply(x, as.character), stringsAsFactors=FALSE) 以在其中执行此操作。
    猜你喜欢
    • 2017-10-03
    • 2018-10-26
    • 1970-01-01
    • 2016-05-21
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多