使用dplyr执行条件mutate操作时出现报错的问题求解
错误成因
- 管道操作中错误引用原始数据表:dplyr管道传递的是每一步处理后的新数据集,
mutate执行时直接引用df1$xxx、df2$xxx原始表的列,合并后的数据集行数和原表不一致,导致newvariable未成功生成,select时提示找不到该对象。 select语法错误:select中仅需要指定处理后数据集中的列名,使用df2$City这种提取原始表列的写法,会直接返回原始表的字符型列,导致select接到非数据框输入,报“无对应character类的select方法”错误。- 逻辑判断语法错误:R不支持
a <= b <= c格式的连续比较写法,必须拆分为两个独立条件用&连接。 - 关联逻辑不匹配:需求要求同时匹配City和Dates两个字段,但原代码
full_join仅指定了City作为关联键,会导致同City不同日期的记录交叉关联,逻辑完全不符合预期。
修正方案
你需要的是对df2的每一条记录,匹配对应City、日期下df1的时间区间,再判断时间是否在区间内,使用左连接即可实现,无需全连接和额外的半连接过滤:
library(dplyr) NEW_DF <- df2 %>% # 按需要匹配的两个字段关联df1,若两个表日期字段名不同,调整by参数的映射即可,例如by = c("City", "Dates" = "Date") left_join(df1, by = c("City", "Dates")) %>% mutate(newvariable = case_when( # 时间落在区间内返回1 Time >= Start & Time <= End ~ 1, # 匹配到了区间但时间不在范围内返回0 !is.na(Start) & !is.na(End) ~ 0, # 未匹配到对应City和日期的区间返回NA TRUE ~ NA_real_ )) %>% # 按需保留字段 select(City, Date = Dates, Time, newvariable)
内容的提问来源于stack exchange,提问作者Jedi93
相关产品推荐
相关产品推荐

