使用 R 在 lapply() 中应用 Magrittr 管道
Applying a Magrittr Pipe in lapply() with R
我想找到一种方法,通过 lapply 语句实现一系列管道函数,并由此生成多个数据库。这是一个示例数据集:
# the data
d <- tibble(
categorical = c("a", "d", "b", "c", "a", "b", "d", "c"),
var_1 = c(0, 0, 1, 1, 1, 0, 1, 0),
var_2 = c(0, 1, 0, 0, 0, 0 ,1, 1),
var_3 = c(0, 0, 1, 1, 1, 1, 1, 1),
var_4 = c(0, 1, 0, 1, 0, 0, 0, 0)
)
这是我想要的结果:
$var_1
a b c d
1 1 1 1
$var_2
a b c d
0 0 1 2
$var_3
a b c d
1 2 2 1
$var_4
a b c d
0 0 1 1
我可以轻松地单独重新创建每个列表元素。这是我使用 dplyr 的示例代码:
d %>%
filter(var_1 == 1) %>%
group_by(categorical, var_1) %>%
summarise(n = n()) %>%
select(-var_1) %>%
rename("var_1" = "n") %>%
ungroup() %>%
spread(categorical, var_1)
# A tibble: 1 x 4
a b c d
<int> <int> <int> <int>
1 1 1 1 1
但是,我想在所有列中自动执行该过程,并创建一个包含每行信息的列表的对象。
这是我开始的地方:
lapply(d[,2:5], function (x) d %>%
filter(x == 1) %>%
group_by(categorical, x) %>%
summarise(n = n()) %>%
select(-x) %>%
rename("x" = "n") %>%
ungroup() %>%
spread(categorical, x))
如有任何帮助,我们将不胜感激!
我们可以gather
转换成'long'格式,然后在得到'val'的sum
之后做一个group_split
和spread
它回来按 'categorical'
分组
library(tidyverse)
gather(d, key, val, -categorical) %>%
split(.$key) %>%
map(~ .x %>%
group_by(categorical) %>%
summarise(val = sum(val)) %>%
spread(categorical, val))
#$var_1
# A tibble: 1 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 1 1 1 1
#$var_2
# A tibble: 1 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 0 0 1 2
#$var_3
# A tibble: 1 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 1 2 2 1
#$var_4
# A tibble: 1 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 0 0 1 1
或者另一种选择是遍历除第一列以外的列,然后执行 group_by
sum
和 spread
到 'wide' 格式
map(names(d)[-1], ~
d %>%
group_by(categorical) %>%
summarise(n = sum(!! rlang::sym(.x))) %>%
spread(categorical, n))
这是一个使用 data.table::transpose()
的选项:
aggregate(. ~ categorical, d, sum) %>%
data.table::transpose(make.names = "categorical") %>%
split(names(d)[-1])
#> $var_1
#> a b c d
#> 1 1 1 1 1
#>
#> $var_2
#> a b c d
#> 2 0 0 1 2
#>
#> $var_3
#> a b c d
#> 3 1 2 2 1
#>
#> $var_4
#> a b c d
#> 4 0 0 1 1
由 reprex package (v0.3.0)
于 2019-11-04 创建
我想找到一种方法,通过 lapply 语句实现一系列管道函数,并由此生成多个数据库。这是一个示例数据集:
# the data
d <- tibble(
categorical = c("a", "d", "b", "c", "a", "b", "d", "c"),
var_1 = c(0, 0, 1, 1, 1, 0, 1, 0),
var_2 = c(0, 1, 0, 0, 0, 0 ,1, 1),
var_3 = c(0, 0, 1, 1, 1, 1, 1, 1),
var_4 = c(0, 1, 0, 1, 0, 0, 0, 0)
)
这是我想要的结果:
$var_1
a b c d
1 1 1 1
$var_2
a b c d
0 0 1 2
$var_3
a b c d
1 2 2 1
$var_4
a b c d
0 0 1 1
我可以轻松地单独重新创建每个列表元素。这是我使用 dplyr 的示例代码:
d %>%
filter(var_1 == 1) %>%
group_by(categorical, var_1) %>%
summarise(n = n()) %>%
select(-var_1) %>%
rename("var_1" = "n") %>%
ungroup() %>%
spread(categorical, var_1)
# A tibble: 1 x 4
a b c d
<int> <int> <int> <int>
1 1 1 1 1
但是,我想在所有列中自动执行该过程,并创建一个包含每行信息的列表的对象。
这是我开始的地方:
lapply(d[,2:5], function (x) d %>%
filter(x == 1) %>%
group_by(categorical, x) %>%
summarise(n = n()) %>%
select(-x) %>%
rename("x" = "n") %>%
ungroup() %>%
spread(categorical, x))
如有任何帮助,我们将不胜感激!
我们可以gather
转换成'long'格式,然后在得到'val'的sum
之后做一个group_split
和spread
它回来按 'categorical'
library(tidyverse)
gather(d, key, val, -categorical) %>%
split(.$key) %>%
map(~ .x %>%
group_by(categorical) %>%
summarise(val = sum(val)) %>%
spread(categorical, val))
#$var_1
# A tibble: 1 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 1 1 1 1
#$var_2
# A tibble: 1 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 0 0 1 2
#$var_3
# A tibble: 1 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 1 2 2 1
#$var_4
# A tibble: 1 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 0 0 1 1
或者另一种选择是遍历除第一列以外的列,然后执行 group_by
sum
和 spread
到 'wide' 格式
map(names(d)[-1], ~
d %>%
group_by(categorical) %>%
summarise(n = sum(!! rlang::sym(.x))) %>%
spread(categorical, n))
这是一个使用 data.table::transpose()
的选项:
aggregate(. ~ categorical, d, sum) %>%
data.table::transpose(make.names = "categorical") %>%
split(names(d)[-1])
#> $var_1
#> a b c d
#> 1 1 1 1 1
#>
#> $var_2
#> a b c d
#> 2 0 0 1 2
#>
#> $var_3
#> a b c d
#> 3 1 2 2 1
#>
#> $var_4
#> a b c d
#> 4 0 0 1 1
由 reprex package (v0.3.0)
于 2019-11-04 创建