如何将数据帧列转换为数字类型?


当前回答

有一点对我很有帮助:如果要转换的变量范围(或者不止一个),可以使用sapply。

有点荒谬,举个例子:

data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)

假设第3列、第6-15列和第37列的数据帧需要转换为数字:

dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)

其他回答

如果x是dataframe dat的列名,x的类型是factor,使用:

as.numeric(as.character(dat$x))

考虑到可能存在char列,这是基于@Abdou在获取列类型的excel表格自动回答:

makenumcols<-function(df){
  df<-as.data.frame(df)
  df[] <- lapply(df, as.character)
  cond <- apply(df, 2, function(x) {
    x <- x[!is.na(x)]
    all(suppressWarnings(!is.na(as.numeric(x))))
  })
  numeric_cols <- names(df)[cond]
  df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
  return(df)
}
df<-makenumcols(df)

要将字符转换为数字,您必须通过应用将其转换为因数

BankFinal1 <- transform(BankLoan,   LoanApproval=as.factor(LoanApproval))
BankFinal1 <- transform(BankFinal1, LoanApp=as.factor(LoanApproval))

您必须用相同的数据创建两列,因为一列不能转换为数字。如果你做一次转换,它会给出如下错误

transform(BankData, LoanApp=as.numeric(LoanApproval))

警告信息: 在eval(替代(列表 (...)), `_ 数据”,parent.frame ()): 胁迫引入的NAs

所以,在做了两列相同的数据应用后

BankFinal1 <- transform(BankFinal1, LoanApp      = as.numeric(LoanApp), 
                                    LoanApproval = as.numeric(LoanApproval))

它将成功地将字符转换为数字

如果数据帧有多种类型的列,一些字符,一些数字尝试以下转换列包含数值为数值:

for (i in 1:length(data[1,])){
  if(length(as.numeric(data[,i][!is.na(data[,i])])[!is.na(as.numeric(data[,i][!is.na(data[,i])]))])==0){}
  else {
    data[,i]<-as.numeric(data[,i])
  }
}

如果您不关心保留因子,并希望将其应用到任何可以转换为数字的列,我使用下面的脚本。 如果df是您的原始数据框架,您可以使用下面的脚本。

df[] <- lapply(df, as.character)
df <- data.frame(lapply(df, function(x) ifelse(!is.na(as.numeric(x)), as.numeric(x),  x)))

顺便说一句,我参考了谢恩和乔兰的解决方案