如何删除零值,直到在R数据帧中出现第一个非零值?

时间:2018-08-07 23:16:02

标签: r dataframe dplyr

标题说明了一切!我对数据进行了分组,直到行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)
)

2 个答案:

答案 0 :(得分:2)

这是一个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()

答案 1 :(得分:1)

您可以在基础R中进行操作:

subset(problem,ave(value,id,FUN=cumsum)>0)
#    id value
# 3   1     2
# 4   1     0
# 6   2     8
# 7   2     4
# 8   2     2
# 9   3     1
# 10  3     7
# 11  3     6
# 12  3     5

如果您的实际情况为负值,请使用abs(value)