繁体   English   中英

map_dfr:使用字符串标签填充.id列,而不是没有.x命名的索引

[英]map_dfr: populate .id column with string labels instead of indices without .x named

我想用map_dfr而不是索引值来标记map_dfr输出中的.id列条目,但我的输入没有命名(这就是map接受.id字符串值的方式 )。

在这种情况下,将名称映射到.id字段的最佳方法是什么?

示例数据:

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))

foobar都是心理测量尺度,我想使用psych::alpha()为每个尺度采取一定程度的可靠性。
唯一相关的列具有命名模式foo_<int> (对于foo标度)或bar_<int>用于bar标度(因此下面的正则表达式匹配)。

实际上,我有许多尺度,并且有许多列构成了每个尺度。 所以我认为map可能是执行计算的好方法,如下所示:

require(psych)
require(tidyverse)

categories <- c("foo", "bar")

categories %>%
  map_dfr(~df %>% 
            select(matches(paste0("^",.x,"_?\\d"))) %>% 
            do(psych::alpha(., check.keys=TRUE)$total), .id="scale") %>%
  select(scale, raw_alpha, std.alpha)

  scale raw_alpha std.alpha
1     1 0.2275679 0.2791238
2     2 0.4141225 0.4130054

但是我希望scale能够取值foobar

  scale raw_alpha std.alpha
1   foo 0.2275679 0.2791238
2   bar 0.4141225 0.4130054

在这个玩具示例中,仅手动创建categories <- c(foo="foo", bar="bar")并不是那么糟糕,但是需要付出太多努力的许多尺度。

我有一个想法是用Python中的zip来自动化foo="foo"方法,以创建键值对的向量,例如c(scale_name="scale_name",...) ,但我不知道我知道如何在R中做到这一点。无论如何,这种方法并不是很漂亮(尽管我很乐意仅仅考虑功能)。

有关如何最好地获取我正在寻找的输出格式的任何建议?

除非我错过了一些更复杂的问题,否则这很容易解决。 你可以在map_dfr添加mutate ,这样你就可以根据传递给map_dfr的值创建一个列。 您可以删除.id位并使用mutate调用来生成scale列; 我只是想并排显示scalescale_cat

library(tidyverse)

set.seed(123)
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")

categories %>%
    map_dfr(~df %>% 
                        select(matches(paste0("^",.x,"_?\\d"))) %>% 
                        do(psych::alpha(., check.keys=TRUE)$total) %>%
                        mutate(scale_cat = .x), 
                    .id="scale") %>%
    select(scale, scale_cat, raw_alpha, std.alpha)
#>   scale scale_cat raw_alpha std.alpha
#> 1     1       foo 0.2606448 0.2601066
#> 2     2       bar 0.4571981 0.4827263

reprex包 (v0.2.0)于2018-05-12创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM