按列号从旧数据帧制作新数据帧

时间:2019-05-29 01:52:55

标签: r dataframe

我正在尝试按列顺序重新组织数据框

例如

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 :(得分:0)

假设所有数据框中的列数相等,一种方法是在数据框列表上使用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, `[`, .)))

答案 1 :(得分:0)

我们可以使用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]))