如何在R的data.table中创建特定的列as.numeric并保持其余的原样?

时间:2016-08-08 11:52:37

标签: r data.table

假设我有以下数据库:

db<-data.frame(para=c(round(rnorm(20,10,10),0)),sal1=c(rnorm(20,100,7)),sal2=c(rnorm(20,100,7)),sal3=c(rnorm(10,100,7)),sal4=rep(c("a","b"),5))

   para      sal1      sal2      sal3 sal4
1    -3  89.72090 105.79164 101.09462    a
2     3 102.64036 104.07501  96.41335    b
3    11 104.65196  90.49886 101.81897    a
4    27  99.61455 102.23207 108.41161    b
5    24 101.18734  98.16081 103.04760    a

我想只将sal1,sal2,sal3作为数字并按原样休息。 它应该推广,因为我有118列,我想要作为数字,并希望保持其余原样。

我试过了:

check<-names(db)
db<-db[as.numeric(get(check[which(check=="sal1"):(which(check=="sal1")+2)]))]

但我认为这只是在黑暗中拍摄的。

1 个答案:

答案 0 :(得分:2)

我们可以使用grep选择以&#39; sal&#39;开头的列,使用该索引对“db&#39;”进行子集,循环遍历列,然后转换为numeric将输出分配给&#39; db [nm1]`

 nm1 <- grep("^sal\\d+", names(db))
 db[nm1] <- lapply(db[nm1], as.numeric)

如果我们需要data.table,请转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(db)),指定.SDcols中的列,循环显示Data.table的子集(.SD),转换为numeric并指定(:=)它回到相同的列名。

library(data.table)
setDT(db)[, (nm1) := lapply(.SD, as.numeric), .SDcols = nm1]