Генерация каждой комбинации переменных из списка - PullRequest
1 голос
/ 03 октября 2019

У меня есть список, который выглядит примерно так ..

$mpg
  mpg_0.01 mpg_0.25 mpg_0.5
1    0.210    5.250   10.50
2    0.210    5.250   10.50
3    0.228    5.700   11.40
4    0.214    5.350   10.70
5    0.187    4.675    9.35
6    0.181    4.525    9.05

$cyl
  cyl_0.01 cyl_0.25 cyl_0.5
1     0.06      1.5       3
2     0.06      1.5       3
3     0.04      1.0       2
4     0.06      1.5       3
5     0.08      2.0       4
6     0.06      1.5       3

Я хочу создать новый список, в котором каждый элемент представляет собой отдельную комбинацию переменных из исходного списка, чтобы в результате чего-то получилосьнапример, так:

$`1`
  mpg_01 cyl_25
1  0.210    1.5
2  0.210    1.5
3  0.228    1.0
4  0.214    1.5
5  0.187    2.0

$`2`
  mpg_01 cyl_5
1  0.210     3
2  0.210     3
3  0.228     2
4  0.214     3
5  0.187     4

$`3`
  mpg_25 cyl_5
1  5.250     3
2  5.250     3
3  5.700     2
4  5.350     3
5  4.675     4
...

Порядок переменных в списке не имеет значения, поэтому нам потребуется только одна из (mpg_01, cyl_5) или (cyl_5, mpg_01).

Я думаю, что использование cross из purrr делает то, что мне нужно, но не соответствует именам столбцов

Вот некоторые примеры данных:

library(tidyverse) 

df <- list(
  mpg =
    mtcars %>%
    head() %>%
    transmute(
      mpg_0.01 = mpg * 0.01,
      mpg_0.25 = mpg * 0.25,
      mpg_0.5 = mpg * 0.5
    ),
  cyl =
    mtcars %>%
    head() %>%
    transmute(
      cyl_0.01 = cyl * 0.01,
      cyl_0.25 = cyl * 0.25,
      cyl_0.5 = cyl * 0.5
    )
)

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Мы можем использовать cross, а затем bind_cols в каждом списке

library(purrr)
df1 <- cross(df) %>% map(dplyr::bind_cols)

Однако, как уже упоминалось в посте, это приводит к потере имен столбцов, и обходной путь состоит в том, чтобы присвоить имена обратноиспользуя cross и создавая комбинацию имен каждого кадра данных в df

map2(df1, cross(map(df, names)), setNames)


#[[1]]
# A tibble: 6 x 2
#   mpg_0.01 cyl_0.01
#     <dbl>    <dbl>
#1    0.21      0.06
#2    0.21      0.06
#3    0.228     0.04
#4    0.214     0.06
#5    0.187     0.08
#6    0.181     0.06

#[[2]]
# A tibble: 6 x 2
#  mpg_0.25 cyl_0.01
#     <dbl>    <dbl>
#1     5.25     0.06
#2     5.25     0.06
#3     5.7      0.04
#4     5.35     0.06
#5     4.68     0.08
#6     4.53     0.06
#...
1 голос
/ 03 октября 2019
combin_mat <- expand.grid(lapply(df, names))
#        mpg      cyl
# 1 mpg_0.01 cyl_0.01
# 2 mpg_0.25 cyl_0.01
# 3  mpg_0.5 cyl_0.01
# 4 mpg_0.01 cyl_0.25
# 5 mpg_0.25 cyl_0.25
# 6  mpg_0.5 cyl_0.25
# 7 mpg_0.01  cyl_0.5
# 8 mpg_0.25  cyl_0.5
# 9  mpg_0.5  cyl_0.5

apply(
  combin_mat, 
  1, 
  function(x) do.call(cbind, lapply(seq_along(df), function(i) df[[i]][x[i]]))
)
# [[1]]
#   mpg_0.01 cyl_0.01
# 1    0.210     0.06
# 2    0.210     0.06
# 3    0.228     0.04
# 4    0.214     0.06
# 5    0.187     0.08
# 6    0.181     0.06

# [[2]]
#   mpg_0.25 cyl_0.01
# 1    5.250     0.06
# 2    5.250     0.06
# 3    5.700     0.04
# 4    5.350     0.06
# 5    4.675     0.08
# 6    4.525     0.06

# and so on ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...