R data.table:使用keyby在j中设置分组变量
假设我有这个数据集R data.table:使用keyby在j中设置分组变量,r,data.table,subset,R,Data.table,Subset,假设我有这个数据集 test <- data.table(X = rep(1, 3), Y = rep("a", 3)) 我想知道为什么 test[, X[Y == "a"], keyby = .(X)] 给予 提前感谢您的回答 它在uniqueN中返回2,因为有两个值-1)“X”分组值1和NA填充。我们可以在uniqueN中使用na.rm=TRUE test[, uniqueN(X[Y == "a"], na.rm = T
test <- data.table(X = rep(1, 3), Y = rep("a", 3))
我想知道为什么
test[, X[Y == "a"], keyby = .(X)]
给予
提前感谢您的回答 它在
uniqueN
中返回2
,因为有两个值-1)“X”分组值1和NA
填充。我们可以在uniqueN
中使用na.rm=TRUE
test[, uniqueN(X[Y == "a"], na.rm = TRUE), keyby = .(X)]
# X V1
#1: 1 1
如@ThomasIsCoding post中所述,逻辑向量和分组变量(返回长度1)的length
之间的length
不匹配会导致使用NA填充额外的真位置。一个选项是rep
licate
test[, rep(X, .N)[Y == "a"], keyby = .(X)]
# X V1
#1: 1 1
#2: 1 1
#3: 1 1
如果分别运行
X
和Y==“a”
> test[, X, keyby = .(X)]
X X
1: 1 1
> test[, Y == "a", keyby = .(X)]
X V1
1: 1 TRUE
2: 1 TRUE
3: 1 TRUE
您将看到,第一个给出长度为1的数值1
,第二个给出长度为3的逻辑值TRUE
由于您没有匹配的子集长度,您将获得NA
s以填写相应的位置,例如
> 1[rep(TRUE,3)]
[1] 1 NA NA
嗯,从某种程度上说,这很复杂 它与分组中的
X
有关
考虑这些变化:
描述
表达
你的
测试[,X[Y==“a”]
,keyby=(X)]
X仅限
测试[,X
,keyby=(X)]
Y==仅限“a”
测试[,Y==“a”
,keyby=(X)]
您是否打算执行
test[Y=='a',.SD,keyby=.(X)]
或test[,.SD[Y=='a'],keyby=.(X)]
不确定为什么要使用分组列对其进行子集划分,因为分组列输出单个元素,而另一个Y=='a'返回3,因此它被NA填充(除非复制XIt用于越界索引的标准R行为。请参阅:“如果i
为正且超过length(x)
,则相应的选择为NA
”,并且在每个组中,分组变量的长度实际上为1(请参阅)。逻辑索引的长度(i
)是3。每个组中分组变量的长度是1(x
,您尝试索引的向量;再次,请参阅常见问题解答):“如果i
是正的(是,这里i
是3)并且超过length(x)
(是的,长度索引向量i
是3,要索引的向量长度x
是1)然后相应的选择是NA
侧注:感谢您发布如此小的说明性玩具数据集!
> test[, X, keyby = .(X)]
X X
1: 1 1
> test[, Y == "a", keyby = .(X)]
X V1
1: 1 TRUE
2: 1 TRUE
3: 1 TRUE
> 1[rep(TRUE,3)]
[1] 1 NA NA