我有一个大型数据表,其结构与此可重现示例类似:
d <- data.table(
g =c(1 ,1 ,2 ,2 ,2 ,3 ,3 , 4 , 4),
A =c('a','a','b','b','w','c','q','r','r'),
B =c(1 ,1 ,2 ,2 ,2 ,3 ,3 ,4 , 5),
sameA =c(T , T , F , F , F , F , F , T , T),
sameAB=c(T , T , F , F , F , F , F , F , F)
)
g
表示群体,A
和B
是个体特征。我想创建变量:
sameA
:表示 A 对于该组的所有观察值都是相同的sameAB
:表示 A 和 B 对于该组的所有观测值都是相同的
如何使用 data.table 有效地做到这一点?
最佳答案
也许你可以试试这个。使用 uniqueN
确定每组唯一值的数量(使用 by = g
),并与 1 进行比较。
library(data.table)
d[, c("sameAnew", "saveABnew") := list(uniqueN(A) == 1, uniqueN(A) == 1 & uniqueN(B) == 1), by = g]
或者按照 @jangorecki 的建议,创建一个用大括号 {} 抑制的临时变量,以避免重复 uniqueN(A)
:
d[, c("sameAnew", "saveABnew") := {tmp <- uniqueN(A); list(tmp == 1, tmp == 1 & uniqueN(B) == 1)}, by = g]
输出
g A B sameA sameAB sameAnew saveABnew
1: 1 a 1 TRUE TRUE TRUE TRUE
2: 1 a 1 TRUE TRUE TRUE TRUE
3: 2 b 2 FALSE FALSE FALSE FALSE
4: 2 b 2 FALSE FALSE FALSE FALSE
5: 2 w 2 FALSE FALSE FALSE FALSE
6: 3 c 3 FALSE FALSE FALSE FALSE
7: 3 q 3 FALSE FALSE FALSE FALSE
8: 4 r 4 TRUE FALSE TRUE FALSE
9: 4 r 5 TRUE FALSE TRUE FALSE
关于r - 标记 data.table 的某些列中具有相同行的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62475013/