R语言 根据最新行条件过滤表

yrdbyhpb  于 2023-03-20  发布在  其他
关注(0)|答案(4)|浏览(110)

我有一个如下所示的表:

date  user  X1 X2 X3
1/1     1    0  3 34 
2/1     1    0  7 65
3/1     1    0  0  0
4/1     1   25  4 65
1/1     2  285  0  0
2/1     2    0  0  0
3/1     2    0 54  0
4/1     2    0  0  0

如何使用dplyr选择仅在最后可用日期(4/1)对所有X具有非零数据的用户?在这种情况下,应删除user 2。谢谢

tv6aics1

tv6aics11#

如果组的最后一行中的任何选定列具有非0值,则使用if_any保留组:

library(dplyr) #1.1.0+
df %>%
  filter(if_any(X1:X3, ~ .x[n()] != 0), .by = user)

#   date user X1 X2 X3
# 1  1/1    1  0  3 34
# 2  2/1    1  0  7 65
# 3  3/1    1  0  0  0
# 4  4/1    1 25  4 65
cld4siwp

cld4siwp2#

利用dplyr,我们可以计算last记录的rowSums

library(dplyr)

# or across(X1:X3, last) if you only have positive values
df %>% filter(rowSums(across(X1:X3, ~last(abs(.x)))) != 0, .by = user)

  date user X1 X2 X3
1  1/1    1  0  3 34
2  2/1    1  0  7 65
3  3/1    1  0  0  0
4  4/1    1 25  4 65
bkhjykvo

bkhjykvo3#

另一个选项使用anyc_across来检查值是否为0和最后一个row_number,如下所示:

library(dplyr)
df %>%
  group_by(user) %>%
  filter(any(c_across(starts_with("X")) != 0 & row_number() == n()))
#> # A tibble: 4 × 5
#> # Groups:   user [1]
#>   date   user    X1    X2    X3
#>   <chr> <int> <int> <int> <int>
#> 1 1/1       1     0     3    34
#> 2 2/1       1     0     7    65
#> 3 3/1       1     0     0     0
#> 4 4/1       1    25     4    65

创建于2023年3月15日,使用reprex v2.0.2

3z6pesqy

3z6pesqy4#

尽管OP显然更倾向于dplyr,但data.table解决方案具有完整性

library(data.table)

setDT(df)

df[, .SD[any(.SD[.N, X1:X3] != 0)], user]

   user date X1 X2 X3
1:    1  1/1  0  3 34
2:    1  2/1  0  7 65
3:    1  3/1  0  0  0
4:    1  4/1 25  4 65

相关问题