有条件替换 dplyr 中的数值

问题描述 投票:0回答:3

亲爱的大家,我有一个看起来像这样的数据框

df <- data.frame(time=c(1,2,3,4,1,2,3,4,5), type=c("A","A","A","A","B","B","B","B","B"), count=c(10,0,0,1,8,0,1,0,1))
df

 time type count
1    1    A    10
2    2    A     0
3    3    A     0
4    4    A     1
5    1    B     8
6    2    B     0
7    3    B     1
8    4    B     0
9    5    B     1

我想检查每组类型,如果我看到一个计数为0,则将时间向前的下一个计数替换为0。我不计数从零复活。

我希望我的数据看起来像这样

 time type count
1    1    A    10
2    2    A     0
3    3    A     0
4    4    A     0
5    1    B     8
6    2    B     0
7    3    B     0
8    4    B     0
9    5    B     0
r dplyr tidyverse
3个回答
3
投票

如果我理解正确的话

library(tidyverse)
df <-
  data.frame(
    time = c(1, 2, 3, 4, 1, 2, 3, 4, 5),
    type = c("A", "A", "A", "A", "B", "B", "B", "B", "B"),
    count = c(10, 0, 0, 1, 8, 0, 1, 0, 1)
  )

df %>% 
  group_by(type) %>% 
  mutate(count = if_else(lag(count, default = first(count)) == 0, 0, count))
#> # A tibble: 9 x 3
#> # Groups:   type [2]
#>    time type  count
#>   <dbl> <chr> <dbl>
#> 1     1 A        10
#> 2     2 A         0
#> 3     3 A         0
#> 4     4 A         0
#> 5     1 B         8
#> 6     2 B         0
#> 7     3 B         0
#> 8     4 B         0
#> 9     5 B         0

reprex 包于 2021 年 9 月 10 日创建(v2.0.1)


2
投票

您可以使用

cummin
功能。

library(dplyr)
df %>% group_by(type) %>% mutate(count = cummin(count))

#   time type  count
#  <dbl> <chr> <dbl>
#1     1 A        10
#2     2 A         0
#3     3 A         0
#4     4 A         0
#5     1 B         8
#6     2 B         0
#7     3 B         0
#8     4 B         0
#9     5 B         0

由于

cummin
是一个基本 R 函数,您也可以在基本 R 中实现它 -

transform(df, count = ave(count, type, FUN = cummin))

0
投票

一个

Base R
的方法:

n <- length(df$type)
df$count <- c(1,ifelse(df$type[1:(n-1)] == df$type[2:n],0,1))*df$count

输出:

df
  time type count
1    1    A    10
2    2    A     0
3    3    A     0
4    4    A     0
5    1    B     8
6    2    B     0
7    3    B     0
8    4    B     0
9    5    B     0
© www.soinside.com 2019 - 2024. All rights reserved.