Создание новых фреймов данных из старых фреймов данных по номеру столбца - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь реорганизовать свои фреймы данных по порядку столбцов

для примера

x <- data.frame("A" = c(1,1), "B" = c(2,2), "C" = c(3,3))
y <- data.frame("A" = c(2,2), "B" = c(3,3), "C" = c(4,4))
z <- data.frame("A" = c(3,3), "B" = c(4,4), "C" = c(5,5))

Скажем, у меня есть фреймы данных, как указано выше.То, что я хочу сделать, это создать новые кадры данных по порядку столбцов вышеупомянутых кадров данных.(Проще говоря, я хочу поместить все "A", "B" и "C" в 3 новых кадра данных.

нижеприведенные кадры данных - это мои требуемые результаты

a <-  data.frame("A" = c(1,1), "A" = c(2,2), "A" = c(3,3))
b <- data.frame("B" = c(2,2), "B" = c(3,3), "B" = c(4,4))
c <- data.frame("C" = c(3,3), "C" = c(4,4), "C" = c(5,5))

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Мы можем сделать это с tidyverse

library(tidyverse)
list(x, y, z) %>% 
     transpose %>%
     map(~ do.call(cbind, .x))

или с base R

lapply(names(x), function(nm) cbind(x[, nm], y[, nm], z[, nm]))
0 голосов
/ 29 мая 2019

Предполагая, что у вас одинаковое количество столбцов во всех фреймах данных, один из способов - использовать lapply над списком фреймов данных и последовательно их подбирать.

lst1 <- list(x, y, z)
lapply(seq_len(ncol(x)), function(i) cbind.data.frame(lapply(lst1, `[`, i)))

#[[1]]
#  A A A
#1 1 2 3
#2 1 2 3

#[[2]]
#  B B B
#1 2 3 4
#2 2 3 4

#[[3]]
#  C C C
#1 3 4 5
#2 3 4 5

Если ваши фреймы данных еще не отсортированы по именамВы могли бы хотеть сделать это сначала.

lst1 <- lapply(list(x, y, z), function(i) i[order(names(i))])

Мы также можем использовать purrr, используя ту же логику

library(purrr)
map(seq_len(ncol(x)), ~cbind.data.frame(map(lst1, `[`, .)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...