使用purrr::map处理group_split后的tibble列表,如何用一列值生成命名列表?
问题解决:用purrr处理分组tibble生成命名列表
错误原因分析
你的代码报错是因为set_names(.x, "v1")里的"v1"被当作字符串,导致set_names调用了全局环境中长度为30的原v1向量,而每个分组后的tibble里v3只有10个值,长度不匹配。正确的做法应该是引用当前分组内的v1列作为名称来源。
修正后的代码
以下两种方法都可以实现需求:
方法1:结合mutate与set_names
这种方法会将每个分组的v3列转换为包含命名向量的列表列:
library(tidyverse) v1 <- rep(letters[1:10], 3) v2 <- rep(LETTERS[1:3], 10) v3 <- rnorm(30) t <- tibble(v1, v2, v3) t2 <- t %>% group_split(v2) %>% map(~ .x %>% mutate(v3 = list(set_names(v3, v1)))) # 查看第一个分组的v3 t2[[1]]$v3
方法2:直接在map中修改列
这种方法会直接将v3列替换为命名向量:
t2 <- t %>% group_split(v2) %>% map(function(x) { x$v3 <- set_names(x$v3, x$v1) x }) # 查看第一个分组的v3 t2[[1]]$v3
验证结果
运行上述代码后,每个分组的v3都会以对应行的v1值作为名称,比如第一个分组的v3输出会是类似:
a b c d e f g h i j -0.23017749 1.55870831 0.07050839 0.12928774 1.71506499 0.46091621 -1.26506123 -0.68685285 -0.44566197 1.22408180
内容的提问来源于stack exchange,提问作者Anders Tøndell
相关产品推荐
相关产品推荐

