首页 > 解决方案 > 如何删除零值,直到第一个非零值出现在 R 数据帧中?

问题描述

标题说明了一切!我已经对数据进行了分组,我想按value组删除行,直到第一个 0 为止id

示例代码:

problem <- data.frame(
  id = c(1,1,1,1,2,2,2,2,3,3,3,3), 
  value = c(0,0,2,0,0,8,4,2,1,7,6,5)
)


solution <- data.frame(
  id = c(1,1,2,2,2,3,3,3,3), 
  value = c(2,0,8,4,2,1,7,6,5)
)

标签: rdataframedplyr

解决方案


这是一个dplyr解决方案:

library(dplyr)
problem %>% 
  group_by(id) %>% 
  mutate(first_match = min(row_number()[value != 0])) %>% 
  filter(row_number() >= first_match) %>% 
  select(-first_match) %>% 
  ungroup()

# A tibble: 9 x 2
     id value
  <dbl> <dbl>
1     1     2
2     1     0
3     2     8
4     2     4
5     2     2
6     3     1
7     3     7
8     3     6
9     3     5

或者更简洁地根据 Tjebo 的评论:

problem %>% 
  group_by(id) %>% 
  filter(row_number() >= min(row_number()[value != 0])) %>% 
  ungroup()

推荐阅读