data.table
想到的是在.SDcols
里用函数(比如patterns()
, is.numeric()
等)指定列,然后配合lapply
操作。不足之处是无法直接保留未选择的列,希望能抛砖引玉,出现更好的方法。
library(data.table)
data("iris")
iris_dt<-setDT(iris)
iris_dt[,lapply(.SD,function(x){x+2}),.SDcols=is.numeric][] # 我不知道如何直接保留"Species"这一列
#> Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1: 7.1 5.5 3.4 2.2
#> 2: 6.9 5.0 3.4 2.2
#> 3: 6.7 5.2 3.3 2.2
#> 4: 6.6 5.1 3.5 2.2
#> 5: 7.0 5.6 3.4 2.2
#> ---
#> 146: 8.7 5.0 7.2 4.3
#> 147: 8.3 4.5 7.0 3.9
#> 148: 8.5 5.0 7.2 4.0
#> 149: 8.2 5.4 7.4 4.3
#> 150: 7.9 5.0 7.1 3.8
# iris_dt[,lapply(.SD,function(x){x+2}),.SDcols=is.numeric][
# ,Species:=iris_dt[,Species]][]
iris_dt[,lapply(.SD,function(x){x+200}),.SDcols=patterns("Width")][
,Species:=iris_dt[,Species]][] # 这是一种间接保留`Species`列的想法,希望有人能给出更好的方法
#> Sepal.Width Petal.Width Species
#> 1: 203.5 200.2 setosa
#> 2: 203.0 200.2 setosa
#> 3: 203.2 200.2 setosa
#> 4: 203.1 200.2 setosa
#> 5: 203.6 200.2 setosa
#> ---
#> 146: 203.0 202.3 virginica
#> 147: 202.5 201.9 virginica
#> 148: 203.0 202.0 virginica
#> 149: 203.4 202.3 virginica
#> 150: 203.0 201.8 virginica
<sup>Created on 2021-10-04 by the reprex package (v2.0.1)</sup>