【问题标题】:How to make specific columns as.numeric in R's data.table and keep the rest as it is? [duplicate]如何在 R 的 data.table 中将特定列作为.numeric 并保持其余部分不变? [复制]
【发布时间】:2016-08-08 11:52:37
【问题描述】:

假设我有以下数据库:

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)]))]

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以使用grep 选择以'sal' 开头的列,使用该索引来子集'db',遍历列,然后转换为numeric 将输出分配给'db[nm1 ]`

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

    如果我们在data.table中需要它,将'data.frame'转换为'data.table'(setDT(db)),指定.SDcols中的列,循环遍历Data.table的子集(@987654327 @),转换为 numeric 并将 (:=) 分配回相同的列名。

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

    【讨论】:

    • 非常感谢..这符合我的目的。
    • 嘿,当我使用“setDT(db)[, (nm1) := lapply(.SD, as.numeric), .SDcols = nm1]”进行转换时。因为这是一个因素,所以我的 0 被转换为 1,而 1 被转换为 2。有什么解决方法吗?我们将不胜感激。
    • @AbhijeetArora 好的,在这种情况下,您必须先转换为character,然后再转换为numeric,即setDT(db)[, (nm1) := lapply(.SD, function(x) as.numeric(as.character(x))), .SDcols = nm1]
    猜你喜欢
    • 2021-11-24
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多