首页 > 解决方案 > 仅基于另一列中的一个条件归还特定类型的所有行

问题描述

我得到了以下数据集。

  Name  Date       AC   AD   Value
   A    2008-04               -0.5
   A    2008-06                  3
   A    2009-05               -0.8
   A    2010-04               -0.6
   B    2005-04                  2
   B    2006-05                  2
   B    2010-08                 -1
   C    2012-05                  2
   D    2016-05                  5
   D    2017-05                  6

我对列值中的负数感兴趣。如果我的列值中至少有一个数字是负数,我正在寻找一个代码,它可以让我返回名称 A 中的所有行。

所以在上面的例子中,我对 A 的所有 4 行和 B 的 3 行感兴趣,但我不想从 C 和 D 中获取行,因为对于他们的所有观察结果都没有负值。

  Name  Date       AC   AD   Value
   A    2008-04               -0.5
   A    2008-06                  3
   A    2009-05                  4
   A    2010-04               -0.6
   B    2005-04                  2
   B    2006-05                  2
   B    2010-08                 -1
   B    2012-05                  2
   C    2016-05                  5
   C    2017-05                  6

可以用代码表示吗 谢谢:)

标签: rexcel

解决方案


我们可以使用data.table. 将 'data.frame' 转换为 'data.table' ( setDT(df1),按 'Name' 分组if any'Value' 小于 0,则得到 data.table ( .SD)的子集

library(data.table)
setDT(df1)[, if(any(Value <0)) .SD, Name]
#   Name    Date Value
#1:    A 2008-04  -0.5
#2:    A 2008-06   3.0
#3:    A 2009-05  -0.8
#4:    A 2010-04  -0.6
#5:    B 2005-04   2.0
#6:    B 2006-05   2.0
#7:    B 2010-08  -1.0

或者用subsetfrommbase R

subset(df1, Name %in% names(which(!!table(df1[,1], df1[,3] < 0)[,2])))

数据

df1 <- structure(list(Name = c("A", "A", "A", "A", "B", "B", "B", "C", 
"D", "D"), Date = c("2008-04", "2008-06", "2009-05", "2010-04", 
"2005-04", "2006-05", "2010-08", "2012-05", "2016-05", "2017-05"
 ), Value = c(-0.5, 3, -0.8, -0.6, 2, 2, -1, 2, 5, 6)),
 class =   data.frame", row.names = c(NA, -10L))

推荐阅读