【发布时间】:2021-05-07 01:54:05
【问题描述】:
我有多个按前缀(par___、fri___、gp___ 等)分组在一起的变量,其中有 29 个。
每个变量的值为 0 或 1。我需要做的是对这些组求和(即,partner___1 + partner___2 等),如果 rowSums = 0,则使每个变量 NA。
例如。我的数据如下所示:
| par___ | par___2 | fri___1 | fri___2 |
|---|---|---|---|
| 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 0 | 0 | 0 |
我希望它看起来像这样:
| par___ | par___2 | fri___1 | fri___2 |
|---|---|---|---|
| NA | NA | 1 | 1 |
| 0 | 1 | NA | NA |
| NA | NA | 1 | 0 |
| NA | NA | NA | NA |
我可以这样单独做:
df<- df%>%
mutate(rowsum = rowSums(.[grep("par___", names(.))])) %>%
mutate_at(grep("par___", names(.)), funs(ifelse(rowsum == 0, NA, .))) %>%
select(-rowsum)
我想我可以这样做:
vars <- c('par___', "fri___','gp___')
for (i in vars) {
df<- df%>%
# creates a "rowsum" column storing the sum of columns 1:2
mutate(rowsum = rowSums(.[grep(i, names(.))])) %>%
# applies, to columns 1:2, a function that puts NA when the sum of the rows is 0
mutate_at(grep(i, names(.)), funs(ifelse(rowsum == 0, NA, .))) %>%
select(-rowsum)
}
没有错误消息,但它不起作用。
另外,我试过 mutate(across()) 而不是 mutate_at() 并得到这个错误:
错误:mutate() 输入 ..1 有问题。
x 无法将列表转换为函数
i 输入..1 是across(grep(i, names(.)), list(ifelse(rowsum == 0, NA, .)))。
而且,我尝试使用 list 而不是 funs 并收到此错误:
rowsum == 0 中的错误: 比较 (1) 仅适用于 atomic 和 list 类型
任何帮助将不胜感激!
谢谢大家。
【问题讨论】: