我有一个包含一堆列的数据框,我需要将其转换为数字类型。我编写了以下代码来尝试这样做,但是它说替换有0行。
instanceconvert <- colnames(regmodel[7:262])
for (i in instanceconvert)
{
regmodel$i <- as.numeric(regmodel$i)
}
任何帮助都将不胜感激。
答案 0 :(得分:31)
您可以使用sapply:
dat <- sapply( dat, as.numeric )
如果不是每列都需要转换:
library( taRifx )
dat <- japply( dat, which(sapply(dat, class)=="character"), as.numeric )
答案 1 :(得分: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”执行此操作,因为您可以按名称或列号进行访问/分配。
答案 2 :(得分:4)
以下是其他问题的快速解决方案:
df[] <- lapply(df, function(x) as.numeric(as.character(x)))
答案 3 :(得分:2)
快速肮脏的方式,特别是如果你有需要转换的变量,这意味着很多转换代码是将文件写出并再次使用write.csv /读取它read.csv
write.csv(regmodel, file="regmodel.csv")
read.csv(file="regmodel.csv")
答案 4 :(得分:1)
只需将您想要的列作为数据框d
传递到以下内容中:
data.frame(apply(d, 2, as.numeric))
这逐列,并将每个转换为数字。然后只需相应地更改行名和列名。
答案 5 :(得分:0)
将@Andrii的答案与@RobertYi的评论相结合,我的简短建议是
df[] <- sapply(df, as.numeric)
这可以确保结果保持为数据框。
答案 6 :(得分:0)
除了所有这些方法外,如果您有字符/数字/日期类型的列并希望根据它们的值转换(类型)它们,以下可能有用:
<ComponentB
add={val => setCounterB(counterB+val)}
subtract={val => setCounterB(counterB+val)}/> // using '+' coz val = -1