我得到了以下数据集。
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
可以在代码中表达 谢谢:))
答案 0 :(得分:2)
我们可以ave
与any
一起使用来选择组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))