提问人:T K 提问时间:7/28/2023 更新时间:7/31/2023 访问量:48
在 R 中根据条件更改多列
Change multiple columns based on condition in R
问:
这是我的示例数据集
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
任何帮助都是值得赞赏的 - 谢谢!
答:
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, .)))
上一个:从对象中提取特定属性及其值
评论