我有一个数据框列表,每个数据框都有两列。列在每个数据框中具有相同的类和名称,并且通常仅行数不同,例如,
lst = list(data.frame(n=1:3,
l=letters[seq(1:3)]),
data.frame(n=1:5,
l=letters[seq(1:5)]),
data.frame(n=1:8,
l=letters[seq(1:8)]))
我正在尝试创建一个新的数据帧列表,其中包含每一列(而不是列之间)中值的所有可能的成对组合,但是我一直无法正确地做到这一点。
这段代码为我提供了单列所需的输出,但是我无法弄清楚如何使用lapply或for循环将其应用于列表中所有数据框的所有列,尽管我确定必须有我缺少的东西。
library(gtools)
library(tidyverse)
as.data.frame(combinations(nrow(lst[[1]]), 2, v=lst[[1]]$n, set=T, repeats.allowed=F)) %>%
transmute(x = paste(V1, V2, sep=","))
我真的很感谢任何提示!
我们可以使用map
遍历list
,然后summarise_all
应用combinations
library(dplyr)
library(purrr)
library(tidyr)
library(gtools)
library(stringr)
map(lst, ~ .x %>%
mutate_if(is.factor, as.character) %>%
summarise_all(~ list(combinations(n(), 2, v = .,
set = TRUE, repeats.allowed = FALSE) %>%
as_tibble %>%
transmute(x = reduce(., str_c, sep=", ")))) %>%
unnest(everything(), names_repair = 'unique') %>%
rename_all( ~ str_remove(., "\\.+")))
#[[1]]
# A tibble: 3 x 2
# x1 x2
# <chr> <chr>
#1 1, 2 a, b
#2 1, 3 a, c
#3 2, 3 b, c
#[[2]]
# A tibble: 10 x 2
# x1 x2
# <chr> <chr>
# 1 1, 2 a, b
# 2 1, 3 a, c
# 3 1, 4 a, d
# 4 1, 5 a, e
# 5 2, 3 b, c
# 6 2, 4 b, d
# 7 2, 5 b, e
# 8 3, 4 c, d
# 9 3, 5 c, e
#10 4, 5 d, e
#[[3]]
# A tibble: 28 x 2
# x1 x2
# <chr> <chr>
# 1 1, 2 a, b
# 2 1, 3 a, c
# 3 1, 4 a, d
# 4 1, 5 a, e
# 5 1, 6 a, f
# 6 1, 7 a, g
# 7 1, 8 a, h
# 8 2, 3 b, c
# 9 2, 4 b, d
#10 2, 5 b, e
# … with 18 more rows
或者使用另一个选项crossing
,然后删除镜像行和两列相同的行filter
map(lst, ~
map(.x %>%
mutate_if(is.factor, as.character),
~ crossing(x1 = .x, x2 = .x) %>%
filter(x1 != x2) %>%
filter(!duplicated(cbind(pmin(x1, x2), pmax(x1, x2)))) %>%
transmute(x = reduce(., str_c, sep=", "))) %>%
bind_cols %>%
rename_all(~ str_remove(., "\\.+")))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句