R - 比较列并动态使用列中的结果值
R - Comparing columns and using the resulting value from the column dynamically
我想比较列,然后根据较小的列替换其中一个变量。
这是一个例子:
示例数据框:
#sample dataframe
data_example <- data.frame(var_a = c(1:10), var_b = c(6:9, NA, 1:5), var_c = c(NA, NA, 1:7, NA), var_d = c(1:10), var_e = c(1:5, 6:10))
var_a var_b var_c var_d var_e
1 1 6 NA 1 1
2 2 7 NA 2 2
3 3 8 1 3 3
4 4 9 2 4 4
5 5 NA 3 5 5
6 6 1 4 6 6
7 7 2 5 7 7
8 8 3 6 8 8
9 9 4 7 9 9
10 10 5 NA 10 10
期望的输出:
#desired output
data_example <- data.frame(var_a = c(6,7,1,2,3,1,2,3,4,5), var_b = c(6:9, NA, 1:5), var_c = c(NA, NA, 1:7, NA), var_d = c(1:10), var_e = c(1:5, 6:10))
var_a var_b var_c var_d var_e
1 6 6 NA 1 1
2 7 7 NA 2 2
3 1 8 1 3 3
4 2 9 2 4 4
5 3 NA 3 5 5
6 1 1 4 6 6
7 2 2 5 7 7
8 3 3 6 8 8
9 4 4 7 9 9
10 5 5 NA 10 10
为此我尝试了两种方法:
方法一:
data_example <- data_example %>%
mutate_at(var_a = case_when(
var_b < var_c | var_c == NA_real_ ~ var_b,
var_c < var_b | var_b == NA_real_ ~ var_c
))
报错:
Error in check_dot_cols(.vars, .cols) :
argument ".vars" is missing, with no default
方法二:
data_example$var_a <- case_when(
data_example$var_b < data_example$var_c | data_example$var_c == NA_real_ ~ data_example$var_b,
data_example$var_c < data_example$var_b | data_example$var_b == NA_real_ ~ data_example$var_c
)
var_a var_b var_c var_d var_e
1 NA 6 NA 1 1
2 NA 7 NA 2 2
3 1 8 1 3 3
4 2 9 2 4 4
5 NA NA 3 5 5
6 1 1 4 6 6
7 2 2 5 7 7
8 3 3 6 8 8
9 4 4 7 9 9
10 NA 5 NA 10 10
当这些列中有 NA
时,代码从 var_c
或 var_b
中产生 NA
,而不是从 var_b
中输入值或 var_c
.
如果有使用 dplyr
或 purrr
软件包的解决方案,那就太好了。
谢谢
使用评论中的建议...
data_example %>% mutate(
var_a = pmin(var_b, var_c, na.rm = TRUE))
## var_a var_b var_c var_d var_e
##1 6 6 NA 1 1
##2 7 7 NA 2 2
##3 1 8 1 3 3
##4 2 9 2 4 4
##5 3 NA 3 5 5
##6 1 1 4 6 6
##7 2 2 5 7 7
##8 3 3 6 8 8
##9 4 4 7 9 9
##10 5 5 NA 10 10
我想比较列,然后根据较小的列替换其中一个变量。
这是一个例子:
示例数据框:
#sample dataframe
data_example <- data.frame(var_a = c(1:10), var_b = c(6:9, NA, 1:5), var_c = c(NA, NA, 1:7, NA), var_d = c(1:10), var_e = c(1:5, 6:10))
var_a var_b var_c var_d var_e
1 1 6 NA 1 1
2 2 7 NA 2 2
3 3 8 1 3 3
4 4 9 2 4 4
5 5 NA 3 5 5
6 6 1 4 6 6
7 7 2 5 7 7
8 8 3 6 8 8
9 9 4 7 9 9
10 10 5 NA 10 10
期望的输出:
#desired output
data_example <- data.frame(var_a = c(6,7,1,2,3,1,2,3,4,5), var_b = c(6:9, NA, 1:5), var_c = c(NA, NA, 1:7, NA), var_d = c(1:10), var_e = c(1:5, 6:10))
var_a var_b var_c var_d var_e
1 6 6 NA 1 1
2 7 7 NA 2 2
3 1 8 1 3 3
4 2 9 2 4 4
5 3 NA 3 5 5
6 1 1 4 6 6
7 2 2 5 7 7
8 3 3 6 8 8
9 4 4 7 9 9
10 5 5 NA 10 10
为此我尝试了两种方法:
方法一:
data_example <- data_example %>%
mutate_at(var_a = case_when(
var_b < var_c | var_c == NA_real_ ~ var_b,
var_c < var_b | var_b == NA_real_ ~ var_c
))
报错:
Error in check_dot_cols(.vars, .cols) :
argument ".vars" is missing, with no default
方法二:
data_example$var_a <- case_when(
data_example$var_b < data_example$var_c | data_example$var_c == NA_real_ ~ data_example$var_b,
data_example$var_c < data_example$var_b | data_example$var_b == NA_real_ ~ data_example$var_c
)
var_a var_b var_c var_d var_e
1 NA 6 NA 1 1
2 NA 7 NA 2 2
3 1 8 1 3 3
4 2 9 2 4 4
5 NA NA 3 5 5
6 1 1 4 6 6
7 2 2 5 7 7
8 3 3 6 8 8
9 4 4 7 9 9
10 NA 5 NA 10 10
当这些列中有 NA
时,代码从 var_c
或 var_b
中产生 NA
,而不是从 var_b
中输入值或 var_c
.
如果有使用 dplyr
或 purrr
软件包的解决方案,那就太好了。
谢谢
使用评论中的建议...
data_example %>% mutate(
var_a = pmin(var_b, var_c, na.rm = TRUE))
## var_a var_b var_c var_d var_e
##1 6 6 NA 1 1
##2 7 7 NA 2 2
##3 1 8 1 3 3
##4 2 9 2 4 4
##5 3 NA 3 5 5
##6 1 1 4 6 6
##7 2 2 5 7 7
##8 3 3 6 8 8
##9 4 4 7 9 9
##10 5 5 NA 10 10