R:在具有未知列类的data.frame中将字符转换为数字

时间:2018-06-15 08:32:58

标签: r dataframe character numeric

关于如何在此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实现此目标?

1 个答案:

答案 0 :(得分:2)

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

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