我想用单词而不是索引值来标记.id输出中的列条目map_dfr,但我的输入未命名(这就是接受字符串值的方式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))
Run Code Online (Sandbox Code Playgroud)
和foo都是bar心理测量量表,我想使用 来衡量每个量表的可靠性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
Run Code Online (Sandbox Code Playgroud)
但我想scale采用价值观foo和bar:
scale raw_alpha std.alpha
1 foo 0.2275679 0.2791238
2 bar 0.4141225 0.4130054
Run Code Online (Sandbox Code Playgroud)
在这个玩具示例中,仅手动创建 不会那么糟糕categories <- c(foo="foo", bar="bar"),但是对于许多比例,需要太多的努力。
foo="foo"我的一个想法是使用Python之类的方法自动化该方法zip,创建一个键值对向量,例如c(scale_name="scale_name",...),但我不知道如何在R中做到这一点。无论如何,这种方法不是非常漂亮(尽管我很乐意满足于仅仅是功能性的)。
关于如何最好地获得我正在寻找的输出格式有什么建议吗?
除非我遗漏了一些更复杂的问题,否则这是一个简单的解决方案。您可以只mutate在 内部添加map_dfr,这样您就可以根据传递到 的值创建一列map_dfr。您可以直接删除该.id位并使用mutate调用来创建该scale列;我只是想并排scale展示scale_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
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v0.2.0)于 2018 年 5 月 12 日创建。