我正在尝试按列顺序重新组织数据框
例如
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))
答案 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]))