如何在R的map_dfr中用字符串标签填充.id列(无命名输入)
解决map_dfr中.id列显示自定义标签的问题
这个场景我太熟悉了!你不需要手动创建命名向量,只需要给现有的categories向量自动加上和元素值一致的名字就行,用dplyr里的set_names()就能轻松搞定,完全适配量表数量多的情况。
最优实现代码
直接修改你的代码,只需要给categories加一步命名操作:
require(psych) require(tidyverse) n <- 20 df <- data.frame(foo_1=rnorm(n), foo_2=rnorm(n), foo_3=rnorm(n), foo_a=runif(n), t_foo=runif(n), bar_1=rnorm(n), bar_2=rnorm(n), bar_3=rnorm(n), bar_a=runif(n), t_bar=runif(n)) # 给向量自动命名,名字和元素值一致 categories <- c("foo", "bar") %>% set_names(.) categories %>% map_dfr(~df %>% select(matches(paste0("^",.x,"_?\\d"))) %>% do(psych::alpha(., check.keys=TRUE)$total), .id="scale") %>% select(scale, raw_alpha, std.alpha)
原理说明
map_dfr的.id参数只有当输入是命名向量/列表时,才会把每个元素的名字作为.id列的值;如果是普通向量,就只能返回索引值。用set_names(.)相当于执行了names(categories) <- categories,让向量的每个元素都有了和自身值相同的名字,这样map_dfr就能自动把foo、bar写入scale列了。
备选方案(用map2)
如果你不想修改原向量,也可以用map2_dfr同时传递量表名和标签:
categories <- c("foo", "bar") map2_dfr(categories, categories, function(scale_name, label) { df %>% select(matches(paste0("^", scale_name, "_?\\d"))) %>% do(psych::alpha(., check.keys=TRUE)$total) %>% mutate(scale = label) }) %>% select(scale, raw_alpha, std.alpha)
不过第一种方法更简洁,更适合批量处理大量量表的场景。
内容的提问来源于stack exchange,提问作者andrew_reece
相关产品推荐
相关产品推荐

