在 R 中根据条件更改多列

Change multiple columns based on condition in R

提问人:T K 提问时间:7/28/2023 更新时间:7/31/2023 访问量:48

问:

这是我的示例数据集

dat <- data.frame(role1= c(1, 1, 1, 1, 0, 0 ,0 , 1, 1, 0, 0, 0, 1,
                           0, 0, 0, 1),
                  role2= c(1, 1, 1, 1, 0, 0 ,0 , 1, 1, 0, 0, 0, 1,
                           1, 0, 0, 1),
                  role3= c(0, 0, 0, 1, 0, 0 ,0 , 1, 0, 0, 0, 0, 1,
                           1, 1, 1, 1))

我想编码,如果角色 1-3 都是“0”,则将角色 1-3 更改为“-97”。这就是我能够实现它的方式。但是,我正在寻找一种更有效的方法来对此进行编码,因为我的数据集要检查的不仅仅是 3 列。

dat$role1[dat$role1==0 & dat$role2==0 & dat$role3==1] <- -97
dat$role2[dat$role1==-97 & dat$role2==0 & dat$role3==1] <- -97
dat$role3[dat$role1==-97 & dat$role2==-97 & dat$role3==1] <- -97

这是我希望得到的:

  role1 role2 role3
1      1     1     0
2      1     1     0
3      1     1     0
4      1     1     1
5    -97   -97   -97
6    -97   -97   -97
7    -97   -97   -97
8      1     1     1
9      1     1     0
10   -97   -97   -97
11   -97   -97   -97
12   -97   -97   -97
13     1     1     1
14     0     1     1
15     0     0     1
16     0     0     1
17     1     1     1

任何帮助都是值得赞赏的 - 谢谢!

r dplyr 数据操作

评论


答:

4赞 Maël 7/28/2023 #1

用:rowSums

dat[rowSums(dat == 0) == ncol(dat), ] <- -97

#    role1 role2 role3
# 1      1     1     0
# 2      1     1     0
# 3      1     1     0
# 4      1     1     1
# 5    -97   -97   -97
# 6    -97   -97   -97
# 7    -97   -97   -97
# 8      1     1     1
# 9      1     1     0
# 10   -97   -97   -97
# 11   -97   -97   -97
# 12   -97   -97   -97
# 13     1     1     1
# 14     0     1     1
# 15     0     0     1
# 16     0     0     1
# 17     1     1     1
1赞 LMc 7/29/2023 #2

这是一个选项(因为这是您的问题标签之一):dplyr

library(dplyr)

dat |>  
  rowwise() |>
  mutate(across(everything(), ~ ifelse(all(c_across(everything()) == 0), -97, .))) |>
  ungroup()

或者使用:rowSums

library(dplyr)


dat |>
  mutate(across(starts_with("role"), ~ ifelse(rowSums(pick(starts_with("role"))) == 0, -97, .)))