Julia使用@subset按年份筛选日期列出现MethodError如何解决
错误触发原因
你遇到的报错是DataFramesMeta包的宏语法与R dplyr的默认向量化逻辑差异导致的:
- R dplyr的
filter函数会自动将传入的列操作映射为逐行运算,因此year(travel_date)可以直接对全列生效 - Julia的
Dates.year方法默认仅支持单个Date类型的输入,你当前的写法是尝试直接对travel_date列的整个向量调用Dates.year,没有加广播标记,导致宏解析表达式时出现类型匹配错误。
解决方案
下面两种写法都可以实现你的需求:
写法1:直接加广播标记(最简洁)
在Dates.year后添加.表示将函数广播到列的每一个元素:
maindf = @chain rawdf begin @subset(Dates.year.(:travel_date) .== 2019) end
如果上述写法仍然报错,大概率是你使用的DataFramesMeta版本较低,在列名前加$明确标记列引用即可:
maindf = @chain rawdf begin @subset(Dates.year.($:travel_date) .== 2019) end
写法2:用ByRow明确逐行逻辑(适合更复杂的自定义函数)
如果后续需要写更复杂的逐行判断逻辑,可以用ByRow明确标记逐行运算:
maindf = @chain rawdf begin @subset(ByRow(x -> Dates.year(x) == 2019).(:travel_date)) end
两种写法的运行效率没有明显差异,你可以根据自己的使用习惯选择。
内容的提问来源于stack exchange,提问作者Billpete002
相关产品推荐
相关产品推荐

