在R中基于双表关联按日期范围设置Table A的Flag字段
解决dplyr between函数"expecting a single value"错误的方案
嘿,我明白你遇到的问题了——用dplyr的between()时碰到了"expecting a single value"的报错,对吧?这是因为你还没把两个表按Item正确关联起来,直接用between()的话,它拿到的是整个Sdate和Edate列,而不是对应每个Item的单个日期范围,所以才会报错。下面是具体的解决步骤和代码:
第一步:确保日期列是Date类型
首先得把你的字符型日期转换成R能识别的Date格式,不然日期范围判断会出错:
library(dplyr) # 先构造你的示例数据(实际使用时替换成你的真实数据集) table_a <- tibble( Item = c("Test1", "Test1", "Test1", "Test1", "Test1", "Test2", "Test2", "Test2"), Date = c("1/1/2018", "1/2/2018", "1/3/2018", "1/4/2018", "1/5/2018", "1/6/2018", "1/7/2018", "1/8/2018"), Flag = c("", "x", "x", "x", "", "", "x", "") ) table_b <- tibble( Item = c("Test1", "Test2"), Sdate = c("1/2/2018", "1/7/2018"), Edate = c("1/4/2018", "1/7/2018") ) # 转换日期格式 table_a <- table_a %>% mutate(Date = as.Date(Date, format = "%m/%d/%Y")) table_b <- table_b %>% mutate(Sdate = as.Date(Sdate, format = "%m/%d/%Y"), Edate = as.Date(Edate, format = "%m/%d/%Y"))
第二步:关联表并更新Flag字段
用left_join把两个表按Item关联,这样每个table_a的行都能拿到对应Item的Sdate和Edate,之后再用between()判断并设置Flag:
result <- table_a %>% left_join(table_b, by = "Item") %>% # 按Item关联两个表 mutate(Flag = ifelse(between(Date, Sdate, Edate), "x", "")) %>% # 判断日期范围并设置Flag select(-Sdate, -Edate) # 可选:移除不需要的Sdate和Edate列 # 查看结果 print(result)
运行后你会得到和你期望一致的结果:
# A tibble: 8 × 3 Item Date Flag <chr> <date> <chr> 1 Test1 2018-01-01 "" 2 Test1 2018-01-02 "x" 3 Test1 2018-01-03 "x" 4 Test1 2018-01-04 "x" 5 Test1 2018-01-05 "" 6 Test2 2018-01-06 "" 7 Test2 2018-01-07 "x" 8 Test2 2018-01-08 ""
为什么之前会报错?
你之前的写法可能是直接在table_a里用between(Date, table_b$Sdate, table_b$Edate),但这样table_b$Sdate和table_b$Edate是整个列的向量,而不是对应每个Item的单个值,between()函数期望每个行对应一组单个的起始/结束日期,所以就抛出了"expecting a single value"的错误。通过left_join关联后,每个行都有了对应的日期范围,就能正常判断啦。
内容的提问来源于stack exchange,提问作者RLW
相关产品推荐
相关产品推荐

