R语言across维度计算报错求助:数据处理代码问题排查
问题排查与修正
核心错误原因
你的代码中最关键的问题出在最后一步的条件判断:
if(is.na(.x) & (right == left_side))
这里left_side是字符串"EltA",而right是通过sum(c_across(...))计算得到的数值型列,用数值和字符串做相等判断,结果永远是FALSE,导致replace_na(.x,0)根本不会执行,同时还会触发类型不匹配的警告。
你的真实需求应该是判断right的数值是否等于当前行中EltA列的数值,而非等于字符串"EltA"。
修正后的代码
geo <- c("AT","BE","CZ","DE") time <- c(2020, 2020, 2021,2021) EltA1 <- c(150, NA, 120,NA) EltA2 <- c(60, 70, 80,NA) EltA <- c(210,110,200,8200) test <- data.frame(geo, time, EltA1, EltA2, EltA) left_side <- "EltA" right_side <- c("EltA1","EltA2") test <- test %>% rowwise() %>% mutate(right = sum(c_across(any_of(right_side)),na.rm = TRUE)) %>% ungroup() # 修正条件判断,引用EltA列的数值而非字符串 test <- test %>% mutate(across(all_of(right_side), ~ if(is.na(.x) & (right == .data[[left_side]])) replace_na(.x,0) else .x))
补充说明
- 使用
.data[[left_side]]可以通过字符串变量正确引用数据框中的对应列,实现数值和数值的比较。 - 修正后,当某行的
right(EltA1和EltA2的求和)等于该行的EltA值时,会将该行中right_side里的NA替换为0,符合你的逻辑需求。
内容的提问来源于stack exchange,提问作者IRT
相关产品推荐
相关产品推荐

