You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:21:17