有条件地将列中的值替换为几个交替的值(tidyverse)

clj7thdc  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(81)

假设我有以下数据:

df <- data.frame(group = rep(letters[1:2], each = 4),
                 A = rep(letters[3:4]),
                 B = letters[1:8])

如果列A等于“c”,我现在想有条件地替换列B中的所有值。我想这样做,第一次出现的地方被替换为“x”,第二次出现的地方被替换为“y”,然后再是“x”,然后再是“y”,依此类推。此外,应在每组中单独进行。
因此,预期输出为:

group A B
1     a c x
2     a d b
3     a c y
4     a d d
5     b c x
6     b d f
7     b c y
8     b d h

我试过了。喜欢

library(tidyverse)
df |>  mutate(B = ifelse(A == "c", rep(c("x", "y"), each = 0.5 * sum(A == "c")), B), .by = group)

但这行不通。有什么想法吗

bqf10yzr

bqf10yzr1#

就像这样:

df |> 
    group_by(group) |> 
    mutate(equal_c = cumsum(A == 'c')) |> 
    mutate(new_A = ifelse(
        A != 'c', 
        A, 
        c('y', 'x')[equal_c %% 2 + 1]
    ))
# A tibble: 8 × 5
# Groups:   group [2]
  group A     B     equal_c new_A
  <chr> <chr> <chr>   <int> <chr>
1 a     c     a           1 x    
2 a     d     b           1 d    
3 a     c     c           2 y    
4 a     d     d           2 d    
5 b     c     e           1 x    
6 b     d     f           1 d    
7 b     c     g           2 y    
8 b     d     h           2 d

equal_c计算每个组中'c'的出现情况,然后当A等于'c'时,我们使用它在'x'和'y'之间交替

相关问题