как создать новый список data.frames путем систематической перестановки столбцов из существующего списка data.frames - PullRequest
3 голосов
/ 03 июля 2019

У меня есть список около 100 кадров данных.Я хотел бы создать новый список фреймов данных, в котором первый фрейм данных состоит из первых столбцов всех существующих фреймов данных, а второй фрейм данных состоит из второго столбца и т. Д. *

Пожалуйста, посмотрите код ниже для примера того, что я хочу сделать.

a <- c(0, 0, 1, 1, 1)
b <- c(0, 1, 0, 0, 1)
c <- c(1, 1, 0, 0, 1)
df1 <- data.frame(a, b, c)
df2 <- data.frame(c, b, a)
df3 <- data.frame(b, a, c)
my_lst <- list(df1, df2, df3)

new_df1 <- data.frame(df1[,1], df2[,1], df3[,1])
new_df2 <- data.frame(df1[,2], df2[,2], df3[,2])
new_df3 <- data.frame(df1[,3], df2[,3], df3[,3])

new_lst <- list(new_df1, new_df2, new_df3)

Есть ли более компактный способ сделать это с большими списками, содержащими большие фреймы данных?Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Это опция:

cols <- ncol(my_lst[[1]])

lapply(1:cols, function(x) do.call(cbind, lapply(my_lst, `[`, x)))

[[1]]
  a c b
1 0 1 0
2 0 1 1
3 1 0 0
4 1 0 0
5 1 1 1

[[2]]
  b b a
1 0 0 0
2 1 1 0
3 0 0 1
4 0 0 1
5 1 1 1

[[3]]
  c a c
1 1 0 1
2 1 0 1
3 0 1 0
4 0 1 0
5 1 1 1
1 голос
/ 03 июля 2019

A tidyverse опция для изменения имен столбцов, transpose и bind_cols

library(tidyverse)
my_lst %>%
  map(setNames, letters[1:3]) %>%
  purrr::transpose() %>%
  map(bind_cols)

#$a
# A tibble: 5 x 3
#     V1    V2    V3
#  <dbl> <dbl> <dbl>
#1     0     1     0
#2     0     1     1
#3     1     0     0
#4     1     0     0
#5     1     1     1

#$b
# A tibble: 5 x 3
#     V1    V2    V3
#  <dbl> <dbl> <dbl>
#1     0     0     0
#2     1     1     0
#3     0     0     1
#4     0     0     1
#5     1     1     1

#$c
# A tibble: 5 x 3
#     V1    V2    V3
#  <dbl> <dbl> <dbl>
#1     1     0     1
#2     1     0     1
#3     0     1     0
#4     0     1     0
#5     1     1     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...