假设我有以下数据库:
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)]))]
但我认为这只是在黑暗中拍摄的。
答案 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]