我有一个如下所示的表:
date X1 X2 X3 1/1 0 3 34 2/1 0 7 65 3/1 0 13 0 4/1 25 4 65 5/1 35 0 0 6/1 4 6 9 7/1 0 0 0
如何使用dplyr来选择所有X开始出现非零值的行?在这种情况下,只选择日期为4/1、5/1、6/1和7/1的行。谢谢。
dplyr
4/1
5/1
6/1
7/1
pxy2qtax1#
df %>% filter(cumsum(if_all(starts_with('X'), ~.x > 0))>0) date X1 X2 X3 1 4/1 25 4 65 2 5/1 35 0 0 3 6/1 4 6 9 4 7/1 0 0 0
或者甚至:
df %>% filter(cumsum(if_all(starts_with('X'))>0)>0) date X1 X2 X3 1 4/1 25 4 65 2 5/1 35 0 0 3 6/1 4 6 9 4 7/1 0 0 0
kmynzznz2#
您可以使用cumsum + rowSums
cumsum
rowSums
> subset(df, cumsum(rowSums(df[-1] > 0) == length(df) - 1) > 0) date X1 X2 X3 4 4/1 25 4 65 5 5/1 35 0 0 6 6/1 4 6 9 7 7/1 0 0 0
tzdcorbm3#
如果我没理解错的话:
df[apply(apply(df[, -1], 2, \(col) cumsum(col > 0)), 1, prod) > 0, ] # date X1 X2 X3 # 4 4/1 25 4 65 # 5 5/1 35 0 0 # 6 6/1 4 6 9 # 7 7/1 0 0 0
3条答案
按热度按时间pxy2qtax1#
或者甚至:
kmynzznz2#
您可以使用
cumsum
+rowSums
tzdcorbm3#
如果我没理解错的话: