gpt4 book ai didi

r - data.table 在数字和文本变量上分别分组

转载 作者:行者123 更新时间:2023-12-04 07:34:14 26 4
gpt4 key购买 nike

我试图简化这个 data.table作用于数字和字符变量的两阶段过程。例如。 - 取 textvar 的第一个元素和 sum每个数值变量。考虑这个小例子:

library(data.table)
dt <- data.table(grpvar=letters[c(1,1,2)], textvar=c("one","two","one"),
numvar=1:3, othernum=2:4)
dt
# grpvar textvar numvar othernum
#1: a one 1 2
#2: a two 2 3
#3: b one 3 4

现在我的第一个想法是嵌套 .SDlapply 中删除一个变量调用,但我认为这有点复杂:
dt[, c(textvar=textvar[1], .SD[, lapply(.SD, sum), .SDcols=-c("textvar")]), by=grpvar]
# grpvar textvar numvar othernum
#1: a one 3 5
#2: b one 3 4

然后我想也许我可以单独进行每个分组并加入它们,但这似乎更糟:
dt[, .(textvar=textvar[1]), by=grpvar][ 
dt[, lapply(.SD, sum), by=grpvar, .SDcols=-c("textvar")], on="grpvar"
]
# grpvar textvar numvar othernum
#1: a one 3 5
#2: b one 3 4

是否有更简单的结构可以绕过 .SD 的嵌套?还是加入?我觉得我忽略了一些基本的东西。

最佳答案

j -data.table 中的参数(故意)非常灵活。我们需要记住的是:

As long as j returns a list, each element of the list will become a column in the resulting data.table.



使用事实 c(list, list)list ,我们可以构造表达式如下:
dt[, c(textvar = textvar[1L], lapply(.SD, sum)), # select/compute all cols necessary
.SDcols = numvar:othernum, # provide .SD's columns
by = grpvar] # group by 'grpvar'
# grpvar textvar numvar othernum
# 1: a one 3 5
# 2: b one 3 4

在这里,我没有用 list() 包裹第一个表达式自 textvar[1L]返回一个长度为 1 的向量......即 identical(c(1, list(2, 3)), c(list(1), list(2,3)))TRUE .

请注意,这仅适用于 v1.9.7 .该错误最近刚刚在当前的开发版本中修复。

关于r - data.table 在数字和文本变量上分别分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260894/

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