根据另一列中的一个条件,返回特定类型的所有行

时间:2018-05-18 09:18:57

标签: excel

我得到了以下数据集。

  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

可以在代码中表达 谢谢:))

3 个答案:

答案 0 :(得分:2)

我们可以aveany一起使用来选择组Name的任何行的值是否小于0并选择这些组。

df[ave(df$Value < 0, df$Name, FUN = any), ]

#  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

和使用dplyr的等效filter操作将是

library(dplyr)
df %>%
   group_by(Name) %>%
   filter(any(Value < 0))

答案 1 :(得分:2)

我们可以使用data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1),按&#39;名称&#39; if any&#39;值&#39;小于0,然后获取data.table的子集({ {1}})

.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 来自subset

base R

数据

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

答案 2 :(得分:0)

这里有一个简单的一行解决方案,可用基本的R代码:

df[df$Name %in% unique(df[df$Value<0,"Name"]),]
  Name Value
1    A  -0.5
2    A   3.0
3    A  -0.8
4    A  -0.6
5    B   2.0
6    B   2.0
7    B  -1.0

最小输入数据:

df<-data.frame(Name=c("A","A","A","A","B","B","B","C","D","D"),
               Value=c(-0.5,3,-0.8,-0.6,2,2,-1,2,5,6))