【问题标题】:Subset a data.table with two joined conditions [closed]对具有两个连接条件的 data.table 进行子集[关闭]
【发布时间】:2019-06-20 13:07:27
【问题描述】:

我想使用 data.table 从以下数据集中收集信息。

set.seed(1)
TDT <- data.table(nr= c(1:100),Group = c(rep("A",10),rep("B",10),rep("C",10),rep("D",10),rep("E",10),rep("F",10),rep("G",10),rep("H",10),rep("I",10),rep("J",10)),
                      id = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)),
                      Time = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5),
                      norm = round(runif(100)/10,2),
                      y = sample(100,100),
                      x2 = round(rnorm(100,0.75,0.3),2),
                      x3 = round(rnorm(100,0.75,0.3),2),
                      x4 = round(rnorm(100,0.75,0.3),2),
                      x5 = round(rnorm(100,0.75,0.3),2))
vars <- c("B", "C", "D")

我想获取以下条件适用的行:

组是 A & y >= 50 并且 var(B、C 或 D)的任何值都有 y >= 50。

但我无法正确使用语法。任何想法如何实现这些双重条件?类似的东西

X <- TDT[(Group=="A" & y>=50)&(Group==vars & y>=50)]

编辑:我需要第二个条件来适用于 B OR C OR D。不是 AND。

【问题讨论】:

  • 预期输出是什么?尝试语法并没有说明这一点。例如,id 不能等于 'A',因为它是数字。
  • 对不起,你们是对的!已更正。
  • 我有点搞砸了这个问题。我编辑了它。希望现在更清楚了。
  • 关于您的编辑:正如@IceCreamToucan 所提到的,预期的输出会非常有帮助。
  • 我认为对问题所做的编辑澄清了 OP 的意图。我认为它应该退出“暂停”状态......

标签: r data.table conditional-statements subset


【解决方案1】:

你们很亲密:

TDT[(Group == "A" & y >= 50) & (Group %in% vars & y >= 50), ]

虽然更好的语法是:

TDT[Group %in% c("A", vars) & y >= 50, ]

考虑到条件y &gt;= 50 在这两种情况下都必须保持。

编辑解释

让我解释一下为什么您的代码不起作用:

让我们调用(Group == "A" &amp; y &gt;= 50) 条件1。条件1 使得Group 必须与A 相同,并且y 必须大于或等于50。

条件2,(Group == vars &amp; y &gt;= 50),要求Group等于所有vars的值,即一个向量c("B", "C", "D"),并且y大于等于到 50。第一部分永远不会与您的示例匹配,这就是我引入 %in% 的原因,以检查 Group 是否等于 vars 中的任何值。

&amp; 加入条件 1 和 2 要求 两个 条件都成立,并且 Group 不可能同时等于 A 和说 B

您想检查Group 是否等于由"A"vars 组成的集合中的任何 个值。

更多详情请参阅?'%in%'

【讨论】:

  • 导致空的data.table
  • 非常感谢。是否可以使上述内容仅适用于var的1个类别?
  • 它导致一个空的 data.table 因为&amp; 加入了这两个条件。没有行的组既是 A 又是 vars 中的值。查看我的编辑
  • 您可能希望删除更好的“sintax”中的前括号
  • 既然您使用的是data.table,那么%chin% 可以提高性能。
【解决方案2】:

%in% 允许您匹配多个参数,例如

TDT[Group %in% vars & y>=50]

【讨论】:

  • 此解决方案将省略Group == "A"y &gt;= 50 的情况。玩具数据中有3个这样的案例。
  • 啊,是的,我在编辑问题之前就回答了,所以我只是在猜测 Tom 在问什么。你的答案是正确的:)
猜你喜欢
  • 2020-07-22
  • 2011-03-04
  • 2021-03-11
  • 2014-03-02
  • 1970-01-01
  • 2014-03-24
  • 2020-04-08
  • 2017-08-25
  • 2015-01-12
相关资源
最近更新 更多