函数内使用pivot_wider报错列不存在且无法访问新列
解决自定义函数中pivot_wider的列访问错误
错误原因分析
你的函数存在几个关键问题导致报错:
- 硬编码字符串错误:
filter(country %in% c("a","b"))里的"a"和"b"是固定字符串,不是你传入的参数值,应该直接使用参数名a和b。 - pivot_wider参数逻辑错误:
names_from = c("a","b")完全偏离原逻辑,原代码是用country列的取值生成新列名,这里应该写names_from = country。 - 动态列引用错误:
wow$a和wow$b无法访问动态生成的列(列名是传入的国家名称),需要用[[a]]和[[b]]的方式引用;同时nrow(wow_df)是笔误,函数内的变量是wow而非wow_df。 - 日期参数格式错误:调用函数时
1990-01-01会被R当作数值计算(1990-1-1=1988),必须用字符串格式"1990-01-01"传递日期。
修正后的函数代码
dip <- function(df, a, b, year_min) { wow <- df %>% filter(country %in% c(a, b)) %>% filter(date >= year_min) %>% group_by(rcid) %>% pivot_wider(id_cols = "rcid", names_from = country, # 基于country列生成新列名 values_from = "vote") %>% na.omit() # 用[[a]]/[[b]]访问动态列名,修正nrow的变量引用 percentage <- sum(wow[[a]] == wow[[b]]) * 100 / nrow(wow) return(percentage) } # 正确调用函数,日期用字符串格式 dip(joined_df, "United States", "Germany", "1990-01-01")
逻辑验证
修正后的函数和你直接运行的代码逻辑完全一致:
- 筛选指定的两个国家数据
- 按
rcid分组后,将country列的取值转为新列名,对应填充vote列的值 - 计算两国家投票结果相同的占比
内容的提问来源于stack exchange,提问作者tetristiger
相关产品推荐
相关产品推荐

