【问题标题】:Selection with a filter on row number and value使用对行号和值的过滤器进行选择
【发布时间】:2019-11-04 15:36:52
【问题描述】:

我有以下简单的 data.table “测试”。我想选择 X 等于“A”的第 3 到 8 行的所有行:

library(data.table)
set.seed(1)
test <- data.table(X=c(rep("A",5),rep("B",5)),Y=rnorm(10),Z=rnorm(10))

test[3:8 & X == "A"] # gives the not desired output:

1: A -0.6264538  1.5117812
2: A  0.1836433  0.3898432
3: A -0.8356286 -0.6212406
4: A  1.5952808 -2.2146999
5: A  0.3295078  1.1249309
Warning message:
  In 3:8 & X == "A" :
  longer object length is not a multiple of shorter object length

# desired outcome:

3: A -0.8356286 -0.62124058
4: A  1.5952808 -2.21469989
5: A  0.3295078  1.12493092

在第 3:8 行之间,我想只选择带有 X == "A" 的那些。这怎么可能?请注意,使用test[3:8][X == "A"] 似乎不是一种选择,因为我想对保存在原始数据表中的这些行进行一些计算。

【问题讨论】:

  • test[3:8,][X=="A",]
  • @M-M 我也在考虑同样的问题,但我想对保存在 test.xml 中的其他列(例如 Y 和 Z)执行计算。这种方法会创建一个新的 DT,因此不会保存计算。例如test[3:8,][X=="A", Z := Z+3]

标签: r data.table subset


【解决方案1】:

这里3:8 的长度肯定与第二个表达式 (X == "A") 的长度不同,此外,我们将逻辑索引与数字索引进行比较。相反,通过在行序列上使用 %in% 将第一个表达式转换为逻辑表达式,然后会发生两件事 - 1)长度相同,2)相同类型

test[(seq_len(.N) %in% 3:8) & X == "A"]
#    X          Y          Z
#1: A -0.8356286 -0.6212406
#2: A  1.5952808 -2.2146999
#3: A  0.3295078  1.1249309

【讨论】:

  • 谢谢,我希望它是一个班轮。与.N 合作的有趣方式!
  • @IceCreamToucan 没问题。我是关于编辑的,但发布了另一个解决方案
【解决方案2】:

如果你需要从某个索引(3:8)中选择行,然后过滤掉一个具有某个值的变量(这里 X == 'A'), 你可以试试`dplyr package':

library(data.table)
library(dplyr)
set.seed(1)
test <- data.table(X=c(rep("A",5),rep("B",5)),Y=rnorm(10),Z=rnorm(10))

test %>% slice(3:8) %>% filter(X == 'A')

【讨论】:

  • 仅供参考,OP 在评论中指出他们想要更新/改变这些行。 (不过,您的帖子仍然是对所发布问题的有效答案。)
【解决方案3】:
library(data.table)
set.seed(1)
test <- data.table(X=c(rep("A",5),rep("B",5)),Y=rnorm(10),Z=rnorm(10))

test[test[, .I %in% 3:8 & X == "A"], Z := Z+3][]
#>     X          Y           Z
#>  1: A -0.6264538  1.51178117
#>  2: A  0.1836433  0.38984324
#>  3: A -0.8356286  2.37875942
#>  4: A  1.5952808  0.78530011
#>  5: A  0.3295078  4.12493092
#>  6: B -0.8204684 -0.04493361
#>  7: B  0.4874291 -0.01619026
#>  8: B  0.7383247  0.94383621
#>  9: B  0.5757814  0.82122120
#> 10: B -0.3053884  0.59390132

reprex package (v0.3.0) 于 2019 年 6 月 21 日创建

【讨论】:

  • 谢谢@M-M。我接受了快一点的akrun的回答
  • @Talik3233 别担心,就在昨天,我和阿克伦还在谈论他们是我的对手;)
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
相关资源
最近更新 更多