map_dfr:用字符串标签填充 .id 列,而不是没有 .x 命名的索引
map_dfr: populate .id column with string labels instead of indices without .x named
我想用单词而不是索引值来标记 map_dfr
输出中的 .id
列条目,但我的输入未命名(即 how map
accepts string values for .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))
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
但我希望 scale
取值 foo
和 bar
:
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
列;我只是想并排显示 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
由 reprex package (v0.2.0) 创建于 2018-05-12。
我想用单词而不是索引值来标记 map_dfr
输出中的 .id
列条目,但我的输入未命名(即 how map
accepts string values for .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))
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
但我希望 scale
取值 foo
和 bar
:
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
列;我只是想并排显示 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
由 reprex package (v0.2.0) 创建于 2018-05-12。