R语言中基于不同列日期匹配生成DataFrame新列booked_weather的技术问题
解决R语言DataFrame中按ID+日期匹配生成新列的问题
我来帮你搞定这个需求!你想要给每个公寓(按ID区分),根据booked.date找到同ID下对应date的天气,生成booked_weather列对吧?先说说你原来代码的问题:
- 没有按ID分组,会把不同公寓的日期混在一起匹配,结果肯定不对;
weather[booked.date]的写法错误,booked.date是日期值,不是行索引,没法直接用来取weather的元素;- 没处理
booked.date不存在于当前ID的date列时的NA情况。
下面给你两种靠谱的解决方案,都是用dplyr实现的:
方法一:自连接(清晰直观,推荐)
这种方法通过把表和自己做左连接,精准匹配同ID下的日期对应关系:
library(dplyr) # 第一步:先把日期列转换成Date类型(避免字符匹配的坑) df <- df %>% mutate(across(c(date, booked.date), as.Date)) # 第二步:自连接匹配天气 df_result <- df %>% left_join( # 先做一个子表,只保留ID、日期和天气,用来匹配 df %>% select(ID, date, weather) %>% rename(booked_date_match = date, booked_weather = weather), # 连接条件:ID相同,且预订日期等于子表中的入住日期 by = c("ID" = "ID", "booked.date" = "booked_date_match") )
方法二:分组+match(简洁高效)
如果不想做表连接,可以按ID分组后用match函数定位日期的位置:
library(dplyr) df_result <- df %>% mutate(across(c(date, booked.date), as.Date)) %>% # 按ID分组,确保只在当前公寓的日期里匹配 group_by(ID) %>% # match会返回booked.date在date列中的位置,找不到就返回NA mutate(booked_weather = weather[match(booked.date, date)]) %>% ungroup()
两种方法都能得到你想要的结果:比如ID=2的第2、3行,booked.date是2016-12-01,同ID下这个日期的天气是clouds,所以booked_weather就会正确显示clouds;那些找不到对应日期的行,booked_weather会自动设为NA。
内容的提问来源于stack exchange,提问作者Lenny
相关产品推荐
相关产品推荐

