gpt4 book ai didi

r - 使用 .SDcols 在 data.table 中的列子集应用函数

转载 作者:行者123 更新时间:2023-12-04 09:37:41 29 4
gpt4 key购买 nike

我想对 data.table 中的变量子集应用函数。在这种情况下,我只是更改变量类型。我可以在 data.table 中以几种不同的方式执行此操作,但是我正在寻找一种不需要中间分配的方法(在此示例中为 mycols)并且不需要我指定要更改两次的列.这是一个简化的可重现示例:

library('data.table')
n<-30
dt <- data.table(a=sample(1:5, n, replace=T),
b=as.character(sample(seq(as.Date('2011-01-01'), as.Date('2015-01-01'), length.out=n))),
c1235=as.character(sample(seq(as.Date('2012-01-01'), as.Date('2013-01-01'), length.out=n))),
d7777=as.character(sample(seq(as.Date('2012-01-01'), as.Date('2013-01-01'), length.out=n)))
)

方式一:这有效......但它是硬编码的
mycols <- c('b', 'c1235', 'd7777')
dt1 <- dt[,(mycols):=lapply(.SD, as.Date), .SDcols=mycols]

方式2:这有效......但我需要创建一个中间对象才能使其工作( mycols )
mycols <- which(sapply(dt, class)=='character')
dt2 <- dt[,(mycols):=lapply(.SD, as.Date), .SDcols=mycols]

方式3:这有效,但我需要两次指定这个长表达式
dt3 <- dt[,(which(sapply(dt, class)=='character')):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]

方式4:这不起作用,但我想要这样的东西,它允许我只指定使 .SDcols 的变量一次。我正在寻找某种方法来替换 (.SD):=用一些有用的东西……或者把东西链接在一起。真的,我很想知道是否有人有一种方法可以执行 WAY 1,2,3 中所做的事情,而无需指定使环境膨胀并且不需要两次指定相同列的中间分配。
dt3 <- dt[,(.SD):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]

最佳答案

这是一个单行答案...

for (j in  which(sapply(dt, class)=='character')) set(dt, i=NULL, j=j, value=as.Date(dt[[j]]))

这是 Arun 和 Matt 各自更喜欢的问题 setfor循环而不是使用 .SD
How to apply same function to every specified column in a data.table

关于r - 使用 .SDcols 在 data.table 中的列子集应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31326691/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com