您可以尝试使用dplyr::across。
对于一个虚拟数据dat 定义如下
dat <- data.frame(
variable1 = c(1,2,3,4,5,6,99),
variable2 = c(1,2,99,4,5,6,7),
variable3 = c(1:7),
variable4 = c(5:11),
variable5 = c(1,2,3,4,5,6,999),
variable6 = c(1,2,3,4,999,6,7),
variable7 = c(1:7),
EC = c(-1,-2,-3,-4,-5,-6,-7)
)
variable1 variable2 variable3 variable4 variable5 variable6 variable7 EC
1 1 1 1 5 1 1 1 -1
2 2 2 2 6 2 2 2 -2
3 3 99 3 7 3 3 3 -3
4 4 4 4 8 4 4 4 -4
5 5 5 5 9 5 999 5 -5
6 6 6 6 10 6 6 6 -6
7 99 7 7 11 999 7 7 -7
你可以试试这个方法。
library(dplyr)
dat %>%
rowwise %>%
mutate(across(variable1:variable4, ~ifelse(.x == 99, NA, EC)),
across(variable5:variable7, ~ifelse(.x == 999, NA, EC)))
variable1 variable2 variable3 variable4 variable5 variable6 variable7 EC
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1 -1 -1 -1 -1 -1 -1 -1
2 -2 -2 -2 -2 -2 -2 -2 -2
3 -3 NA -3 -3 -3 -3 -3 -3
4 -4 -4 -4 -4 -4 -4 -4 -4
5 -5 -5 -5 -5 -5 NA -5 -5
6 -6 -6 -6 -6 -6 -6 -6 -6
7 NA -7 -7 -7 NA -7 -7 -7
如果你知道列索引,比如我的dat,从variable1 到variable4 是1:4 和variable5 到variable7 是5:7,只使用列索引会给你同样的结果结果。
dat %>%
rowwise %>%
mutate(across(1:4, ~ifelse(.x == 99, NA, EC)),
across(5:7, ~ifelse(.x == 999, NA, EC)))
variable1 variable2 variable3 variable4 variable5 variable6 variable7 EC
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1 -1 -1 -1 -1 -1 -1 -1
2 -2 -2 -2 -2 -2 -2 -2 -2
3 -3 NA -3 -3 -3 -3 -3 -3
4 -4 -4 -4 -4 -4 -4 -4 -4
5 -5 -5 -5 -5 -5 NA -5 -5
6 -6 -6 -6 -6 -6 -6 -6 -6
7 NA -7 -7 -7 NA -7 -7 -7
添加
dat <- data.frame(
variable1 = c(1,2,3,4,5,6,99),
variable2 = c(1,2,99,4,5,6,7),
variable3 = c(1:7),
variable4 = c(5:10,999),
variable5 = c(1,2,3,4,5,6,99),
variable6 = c(1,2,3,4,999,6,7),
variable7 = c(1:7),
EC = c(-1,-2,-3,-4,-5,-6,-7)
)
dat %>%
rowwise %>%
mutate(across(c(variable1, variable2, variable3, variable5), ~ifelse(.x == 99, NA, EC)),
across(c(variable4, variable6, variable7), ~ifelse(.x == 999, NA, EC)))
variable1 variable2 variable3 variable4 variable5 variable6 variable7 EC
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1 -1 -1 -1 -1 -1 -1 -1
2 -2 -2 -2 -2 -2 -2 -2 -2
3 -3 NA -3 -3 -3 -3 -3 -3
4 -4 -4 -4 -4 -4 -4 -4 -4
5 -5 -5 -5 -5 -5 NA -5 -5
6 -6 -6 -6 -6 -6 -6 -6 -6
7 NA -7 -7 NA NA -7 -7 -7