数据表lapply和输出中的其他列

时间:2019-01-22 12:39:48

标签: r data.table lapply

我只是希望有一种更方便的方法。成像我想用一些列的不同转换来运行模型,例如令人振奋。我想将转换后的数据集提供给模型以及一些不需要转换的其他列。有没有一种可行的方法可以一线解决?我不想使用:=替换数据,因为我计划运行具有不同转换规范的模型。

dt<-data.table(id=1:10, Country=sample(c("Germany", "USA"),10, replace=TRUE), x=rnorm(10,1,10),y=rnorm(10,1,10),factor=factor(sample(LETTERS[1:2],10,replace=TRUE)))
sel.col<-c("x","y")
dt[,lapply(.SD,Winsorize),.SDcols=sel.col,by=factor]

我将需要再次调用data.table以将原始dt与转换后的数据合并,并注意订单。

data.table(dt[,.(id,Country),by=factor],
           dt[,lapply(.SD,Winsorize),.SDcols=sel.col,by=factor])

我希望我可以在lapply调用中加入其他列

dt[,.(lapply(.SD,Winsorize), id, Country),.SDcols=sel.col,by=factor]

还有其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

你只需要吗?

dt[, c(lapply(.SD,Winsorize), list(id = id, Country = Country)), .SDcols=sel.col,by=factor]

不幸的是,这种方法在处理大数据时会变慢。显然,这是在最近的一些更新中进行了优化,但是仍然很慢。

答案 1 :(得分:0)

无需合并,您可以在lapply调用后分配列:


> library(DescTools)
> library(data.table)
> dt<-data.table(id=1:10, Country=sample(c("Germany", "USA"),10, replace=TRUE), x=rnorm(10,1,10),y=rnorm(10,1,10),factor=factor(sample(LETTERS[1:2],10,replace=TRUE)))
> sel.col<-c("x","y")
> dt
    id Country          x           y factor
 1:  1 Germany  13.116248  -0.4609152      B
 2:  2 Germany  -6.623404  -3.7048052      A
 3:  3     USA -18.027532  22.2946805      A
 4:  4     USA -13.377736   6.2021252      A
 5:  5 Germany -12.585897   0.8255081      B
 6:  6 Germany  -8.816252 -12.1218135      B
 7:  7     USA  -3.459926 -11.5710316      B
 8:  8     USA   3.180706   6.3262951      B
 9:  9 Germany  -5.520637   7.2877123      A
10: 10 Germany  15.857069   8.6422997      A
> # Notice an assignment `(sel.col) :=`  here:
> dt[,(sel.col) := lapply(.SD,Winsorize),.SDcols=sel.col,by=factor]
> dt
    id Country          x           y factor
 1:  1 Germany  11.129140  -0.4609152      B
 2:  2 Germany  -6.623404  -1.7234191      A
 3:  3     USA -17.097573  19.5642043      A
 4:  4     USA -13.377736   6.2021252      A
 5:  5 Germany -11.831968   0.8255081      B
 6:  6 Germany  -8.816252 -12.0116571      B
 7:  7     USA  -3.459926 -11.5710316      B
 8:  8     USA   3.180706   5.2261377      B
 9:  9 Germany  -5.520637   7.2877123      A
10: 10 Germany  11.581528   8.6422997      A