基于R中的行非零值过滤表

5rgfhyps  于 2023-03-10  发布在  其他
关注(0)|答案(3)|浏览(117)

我有一个如下所示的表:

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/15/16/17/1的行。谢谢。

pxy2qtax

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
kmynzznz

kmynzznz2#

您可以使用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
tzdcorbm

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

相关问题