使用pivot_wider转换数据时触发vec_as_location()错误求助
问题描述
数据构造代码:
v<-as.numeric(c(rep(c(1,2,3), 3))) n<-as.factor(c(rep("a", 3), rep("b", 3), rep("c", 3))) t<-data.frame(v, n) str(t)
在RStudio 2021.9.0.351中使用tidyr 1.1.4版本执行转宽代码:
t.wide<-t%>%pivot_wider(names_from=n, values_from=v)
触发错误:
Error in `vec_as_location()`: ! `...` must be empty. ✖ Problematic argument: • call = call
解决方案
这个错误的核心原因是:你的长格式数据中,每个n的分组(a、b、c)都对应3个重复的v值,tidyr 1.1.4版本的pivot_wider无法自动处理这种一对多的映射,必须明确指定重复值的处理方式。
有两种可行的解决方式:
方式1:指定值聚合函数(values_fn)
通过values_fn参数告诉函数如何处理每个分组内的重复值,比如将所有值保留为列表,或者计算均值、求和等:
# 把每个分组的v值保留为列表 t.wide <- t %>% pivot_wider(names_from = n, values_from = v, values_fn = list) # 或者计算每个分组v值的均值 t.wide <- t %>% pivot_wider(names_from = n, values_from = v, values_fn = mean)
方式2:添加唯一行标识
如果希望每个分组的每个v值对应宽格式中的一行,可以先给每个分组内的行添加唯一编号,再执行转宽:
# 给每个n分组内的行添加id t <- t %>% group_by(n) %>% mutate(id = row_number()) %>% ungroup() # 转宽 t.wide <- t %>% pivot_wider(names_from = n, values_from = v)
内容的提问来源于stack exchange,提问作者Dustin
相关产品推荐
相关产品推荐

