33

我有一个包含一堆列的数据框,我需要将它们转换为数字类型。我编写了以下代码来尝试执行此操作,但是它说替换有 0 行。

instanceconvert <- colnames(regmodel[7:262])

for (i in instanceconvert)
{
  regmodel$i <- as.numeric(regmodel$i)
}

任何帮助,将不胜感激。

4

7 回答 7

53

您可以为此使用 sapply:

dat <- sapply( dat, as.numeric )

如果不是每一列都需要转换:

library( taRifx )
dat <- japply( dat, which(sapply(dat, class)=="character"), as.numeric )
于 2013-10-02T20:39:06.670 回答
9

这是其他问题的快速解决方案:

df[] <- lapply(df, function(x) as.numeric(as.character(x)))

参考:在 R 中将所有列从因子更改为数字

于 2017-06-22T14:16:19.347 回答
5

正如 SenorO 指出的那样,您的原始代码不起作用的原因是它$i不会评估i以找出它的当前值。您应该改为使用双括号访问并分配给列,这在i名称或索引号时起作用:

for (i in instanceconvert)
{
  regmodel[[i]] <- as.numeric(regmodel[[i]])
}

按照 Ari 的方法,您可以摆脱循环:

regmodel[,instanceconvert] <- 
    lapply(regmodel[,instanceconvert,drop=FALSE],as.numeric)

您也可以使用您的范围 7:262 代替“instanceconvert”来执行此操作,因为您可以按名称或列号访问/分配。

于 2013-10-02T20:50:14.437 回答
5

结合@Andrii 的回答和@RobertYi 的评论,我的简短建议是

df[] <- sapply(df, as.numeric)

这可确保结果保留为数据框。

于 2020-08-11T19:29:38.417 回答
3

只需将您想要的列作为数据框传递d到以下内容中:

data.frame(apply(d, 2, as.numeric))

这将逐列并将每个转换为数字。然后相应地更改您的行名和列名。

于 2018-01-05T15:17:26.760 回答
3

一种快速而肮脏的方法,特别是如果您有需要转换的变量,这意味着很多转换代码是将文件写出并使用 write.csv/read.csv 之类的东西再次读回

write.csv(regmodel, file="regmodel.csv")
read.csv(file="regmodel.csv")
于 2016-07-18T18:34:17.960 回答
1

除了所有这些方法之外,如果您有字符/数字/日期类型的列并希望根据它们的值转换(类型)它们,以下可能有用:

type.convert(df, as.is = TRUE)
于 2021-06-01T06:21:41.093 回答