这是示例代码 df <- data.frame( A = c(1, 2, 3, 4), B = c(5, 6, NA, 8), C = c(9, NA, -1, 11), D = c(-2, 13, 14, 15), E = c(16, -3, 18, NA) ) replace_vec <- c(100, 200, 300) 我想将值为 NA 或 <=0 的列 3:5 替换为 vetor 中的值,replace_vec 就像: df %>% mutate(C = if_else(is.na(C) | C < 0, replace_vec[1], C), D = if_else(is.na(D) | D < 0, replace_vec[2], D), E = if_else(is.na(E) | E < 0, replace_vec[3], E)) 太多if_else而不是那么笼统,也许使用map*或喜欢 df %>% mutate(across(3:5, ~ifelse(is.na(.x) | .x < 0, replace_vec, .))) # or df %>% mutate_at(vars(1:3), ~ map2(.x, replace_values, ~ ifelse(.x < 0 | is.na(.x), .y, .x))) 他们不工作... 如何让代码更通用?多谢!

你可以试试 names(replace_vec) <- c('C', 'D', 'E') df %>% mutate(across(3:5, ~ifelse(is.na(.x) | .x < 0, replace_vec[cur_column()], .x))) A B C D E 1 1 5 9 200 16 2 2 6 100 13 300 3 3 NA 100 14 18 4 4 8 11 15 300

好工作!刚刚看了 的帮助cur_column(),功能理解还是有问题current,能具体解释一下吗?

@Tenstu 请问是什么current意思?

我搜索了帮助页面cur_column(),发现它属于“当前”组或变量。很难想知道它是如何工作的以及与df %>% mutate(across(3:5, ~ifelse(is.na(.x) | .x < 0, replace_vec, .))).

@Tenstu 哦...这current意味着它调用 的.x列名acrosscolumn 3:5,.x调用 column C,D, 和E,并且对于每一列,cur_column()调用C,D, 和E。所以,我给 to replace_veccall 命名为replace_vec[cur_colum()]call replace_vec['C']for column C。

感谢您的耐心讲解,确实帮助很大,我可能需要更多时间练习。