如何在R中使用case_when从多列补全缺失周数据?
解决方案
你的case_when写法错误在于误用了逗号分隔条件与结果,且逻辑判断顺序不符合优先级要求。以下是两种可行的解决方法:
方法一:修正case_when语法
case_when的正确语法是每个分支使用条件 ~ 结果的格式,且需按column1→column2→column3→column4的优先级从高到低判断:
library(dplyr) df <- data.frame (column1 = c("W12", "W18", "", "W13", "", ""), column2 = c("W12", "W18", "W13", "W25", "", ""), column3 = c("", "", "", "", "", "W26"), column4 = c("", "", "", "", "W23", "")) # 添加新列complete,保留原列 df <- df %>% mutate(complete = case_when( column1 != "" ~ column1, # 优先取column1的非空值 column2 != "" ~ column2, # column1为空时取column2的非空值 column3 != "" ~ column3, # column2为空时取column3的非空值 TRUE ~ column4 # 前三列都为空时取column4的值 ))
运行后df$complete的结果为:
[1] "W12" "W18" "W13" "W13" "W23" "W26"
方法二:使用coalesce简化代码
coalesce函数会按顺序返回第一个非NA值,只需先将空字符串""转换为NA即可:
library(dplyr) df <- df %>% mutate(complete = coalesce( na_if(column1, ""), na_if(column2, ""), na_if(column3, ""), na_if(column4, "") ))
此写法更简洁,结果与方法一完全一致。
错误原因说明
你之前的代码用逗号分隔条件和结果,不符合case_when的语法要求——该函数要求每个判断分支是单侧公式(用~连接条件与结果),逗号会被识别为参数分隔符,导致条件部分被当成独立的逻辑向量,从而触发错误提示。
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

