使用dplyr包case_when()函数基于字符型列A填充日期型列B时出现结果异常的问题求助
解决case_when()填充日期列的问题
嘿,我帮你找出问题所在啦!你的代码里有两个关键错误导致结果不符合预期,咱们一步步来修正:
问题出在哪?
- 赋值逻辑搞反了:你在
case_when()里写的B == Date1是在做相等判断,会返回TRUE/FALSE这种布尔值,而不是把Date1的内容赋值给B。这就是为啥B变成布尔型还全是NA——当B或Date1是NA时,判断结果肯定是NA呀。 - 类型不匹配:你的A列是字符型,但条件里用了
A == 1(数值),两者类型对不上,条件永远不成立,自然不会执行对应的填充逻辑。
修正后的代码
先给你贴修正后的完整代码,我还加了示例数据方便你测试:
library(dplyr) # 构造符合你描述的示例数据 df <- tibble( A = as.character(c(1, 2, 3, 4)), B = as.Date(c(NA, NA, NA, NA)), # 假设原始B列都是待填充的NA Date1 = as.Date(c("2024-01-01", NA, NA, NA)), Date2 = as.Date(c(NA, "2024-02-01", NA, NA)), Date3 = as.Date(c(NA, NA, "2024-03-01", NA)), Date4 = as.Date(c(NA, NA, NA, "2024-04-01")) ) # 正确的填充逻辑 df <- df %>% mutate(B = case_when( A == "1" ~ Date1, # 字符型匹配,直接返回对应Date列的值 A == "2" ~ Date2, A == "3" ~ Date3, A == "4" ~ Date4, TRUE ~ B # 默认保留原B值,避免无匹配时被覆盖成NA ))
为啥这么改?
- 把
B == Date1换成Date1:直接把对应Date列的日期值赋值给B,这样B的类型还是Date,不会变成布尔型。 - 把
A == 1改成A == "1":因为A是字符型,必须用字符串来匹配,不然条件永远不成立。 - 加
TRUE ~ B:如果A的值不在1-4范围内,或者对应Date列是NA,就保留B原来的值,避免不必要的NA覆盖。
运行这段代码后,B列就会正确填充对应Date列的日期,类型也保持为Date啦~
内容的提问来源于stack exchange,提问作者a nony mouse
相关产品推荐
相关产品推荐

