如何在一列中交换值的子集,但保持同一列中的其他值不变?

Lik*_*han 3 r

假设我有一个data.frame df:

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

  A B C
1 1 a 1
2 2 a 2
3 3 b 1
4 4 b 2
5 5 c 1
6 6 c 2
7 7 d 1
8 8 d 2
Run Code Online (Sandbox Code Playgroud)

我想交换列中的值B,当它们是b或时c,而不是它们是什么时候,a或者d以另一列为条件C,即何时C = 1.所以目标data.frame是df1:

 df1 <- data.frame(
  A = 1:8,
  B = c("a", "a", "c", "b", "b", "c", "d", "c"),
  C = rep(1:2, 4)      
)

  A B C
1 1 a 1
2 2 a 2
3 3 c 1
4 4 b 2
5 5 b 1
6 6 c 2
7 7 d 1
8 8 c 2
Run Code Online (Sandbox Code Playgroud)

Sot*_*tos 6

你可以试试chartr,

chartr('bc', 'cb', df$B)
#[1] "a" "a" "c" "c" "b" "b" "d" "d"
Run Code Online (Sandbox Code Playgroud)

为了调整它C == 1,

df$B[df$C == 1] <- chartr('bc', 'cb', df$B[df$C == 1])
Run Code Online (Sandbox Code Playgroud)