在这种情况下,如何更好地处理data.table中的group by?
假设我有如下数据:在这种情况下,如何更好地处理data.table中的group by?,r,data.table,R,Data.table,假设我有如下数据: dt <- data.table(x=1:5, y=c(1,1,2,2,1), y.z=c(1,1,2,2,3)) 由于我的懒惰,通常我会选择第二种方式,因为如果类似y的参数列表很长,它可以节省一些输入。即写列表(y.z,y1,y2,y3,…)而不是y1=y1[1],y2=y2[1],y3=y3[1],… 然而,我不确定这是否是一个好的做法。特别是如果发生了y中的一些错误,因此每个组的错误并不都相等,我的方法不会触发任何错误,因此问题不会自动检测出来 定制这样的函数最
dt <- data.table(x=1:5, y=c(1,1,2,2,1), y.z=c(1,1,2,2,3))
由于我的懒惰,通常我会选择第二种方式,因为如果类似y的参数列表很长,它可以节省一些输入。即写列表(y.z,y1,y2,y3,…)
而不是y1=y1[1],y2=y2[1],y3=y3[1],…
然而,我不确定这是否是一个好的做法。特别是如果发生了y
中的一些错误,因此每个组的错误并不都相等,我的方法不会触发任何错误,因此问题不会自动检测出来
定制这样的函数最好吗
dt[,list(x=sum(x), y=assert.identical(y)]), by=y.z]
因此,如果y
只包含一个唯一值,它将返回一个标量,否则它将触发异常。但是,自定义函数应用起来有点不方便,因为它需要输入比y=y[1]
更多的内容
我每天都会遇到这种困境,在R和SQL中,两者都无法治愈。当人们面对它时通常会做什么?
唯一的.data.table
有一个by
参数,而.SD
只是一个数据.table
将这些放在一起可以执行以下操作:
dt[,list(x= unique(.SD[, sum(x)], by=c("y1","y2", "y3")), by=y.z]
请注意,unique中的
by
必须是字符串的向量(列的名称)。这不同于[.data.table
)中对by
的要求。data.table
有一个by
参数,.SD
只是一个数据。table
将这些放在一起可以执行以下操作:
dt[,list(x= unique(.SD[, sum(x)], by=c("y1","y2", "y3")), by=y.z]
请注意,unique中的
by
必须是字符串向量(列的名称)。这与[.data.table
)中的by
的要求不同dt[,list(x=sum(x)),by=list(y.z,y)]?
它与dt[,list(x=sum(x)),by=list(y.z,y)]有何区别?