【问题标题】:data.table: subsetting a grouping variable in j with keybydata.table:用 keyby 对 j 中的分组变量进行子集化
【发布时间】:2021-07-03 18:02:33
【问题描述】:

假设我有这个数据集

test <- data.table(X = rep(1, 3), Y = rep("a", 3))

这给了我们

test
#   X Y
#1: 1 a
#2: 1 a
#3: 1 a

我想知道为什么

test[, X[Y == "a"], keyby = .(X)]

给予

#   X V1
#1: 1  1
#2: 1 NA
#3: 1 NA

提前感谢您的回答!

【问题讨论】:

  • 你是打算做test[Y == 'a', .SD, keyby = .(X)]还是test[, .SD[Y == "a"], keyby = .(X)]
  • 不确定为什么要使用分组列对其进行子集化,因为分组列输出单个元素,而另一个 Y == 'a',返回 3,因此它被 NA 填充(除非你复制 X
  • 这是越界索引的标准 R 行为。参见R Intro3.4.1 Indexing by vectors:“如果i 为正并超过length(x),则对应的选择为NA”,以及在每个组内,分组变量的长度为1(参见FAQ 2.10
  • 确实如此。逻辑索引 (i) 的长度为 3。每个组内的分组变量的长度为 1(x,您尝试索引的向量;再次参见常见问题解答):“如果 i 为正(是的,这里i 是3)并且超过length(x)(是的,长度索引向量i 是3,要索引的向量长度x 是1)然后对应的选择是NA
  • 旁注:感谢您发布这么小的说明性玩具数据集!

标签: r data.table subset


【解决方案1】:

如果您分别运行XY=="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

由于您没有匹配的子集长度,您将获得NAs 填写相应的位置,例如,

> 1[rep(TRUE,3)]
[1]  1 NA NA

【讨论】:

    【解决方案2】:

    它在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 帖子中所述,length 中的逻辑向量与分组变量的length 之间的不匹配(返回长度为 1)导致使用 NA 填充额外的 TRUE 位置。一个选项是replicate

    test[, rep(X, .N)[Y == "a"], keyby = .(X)]
    #   X V1
    #1: 1  1
    #2: 1  1
    #3: 1  1
    

    【讨论】:

      【解决方案3】:

      嗯,在某种程度上,它很复杂。

      这与 X 在分组中的内容有关。

      考虑这些变化:

      description expression
      Yours test[, X[Y == "a"], keyby=.(X) ]
      X only test[, X, keyby=.(X) ]
      Y=="a" only test[, Y == "a", keyby=.(X) ]

      X 只给出:

      
      > test[, X, keyby=.(X) ]
         X X
      1: 1 1
      
      

      这就是您的分组中的“X”。只有那个值。

      第三个表达式:

      
      > test[, Y == "a", keyby=.(X) ]
         X   V1
      1: 1 TRUE
      2: 1 TRUE
      3: 1 TRUE
      
      

      您可以看到Y == "a" 在您的分组中的样子。

      如果您将这些结合起来,在您的分组中执行:X[ Y == "a" ],您可以有效地执行:

      
      X <- 1
      X[ c(TRUE,TRUE,TRUE) ]
      
      

      X 只有一个值,但被要求返回第一个、第二个和第三个值,会给你一个值和 2 个 NA,这就是你所看到的。

      【讨论】:

        猜你喜欢
        • 2016-01-07
        • 2021-03-22
        • 2020-07-24
        • 2019-02-27
        • 2014-03-06
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        • 2021-07-23
        相关资源
        最近更新 更多