R函数来cbind各个列的转置

R function to cbind the transpose of individual columns

我正在寻求有关此主题的帮助,但我认为我正在搜索的词无法为我提供解决方案。

我正在寻找一个函数来遍历数据框并将两行转换为一行,方法是向下移动每一列并将其用作 cbind 函数的第一部分。

我最初有两行数据,但我能想到的唯一方法是将它们组合成一个数据框并创建一个 for 循环来转置每一列并再次运行 cbind

我的是这样的:

    col1 col2 col3 col4
[1,] a1   a2   a3   a4
[2,] b1   b2   b3   b4

我想要这样的东西,如果可能的话,在列名上附加一个识别前缀;

     a.col1 b.col1 a.col2 b.col2 a.col3 b.col3 a.col4 b.col4
[1,]  a1     b1     a2     b2     a3     b3     a4     b4

如果有人能告诉我有用的包或功能,我将不胜感激!

这里有一个选项dcast

library(reshape2)
df$indx <- 1
res <- dcast(transform(melt(df, id.var='indx'), indx2=letters[1:2]), 
                          indx~indx2+variable, value.var='value')[-1]

res1 <-  res[order(sub('^.*_', '', names(res)))]
res1
# a_col1 b_col1 a_col2 b_col2 a_col3 b_col3 a_col4 b_col4
#1     a1     b1     a2     b2     a3     b3     a4     b4

或使用dplyr/tidyr

 library(dplyr)
 library(tidyr)
 gather(df, Var, Val, -indx) %>% 
                     mutate(indx2=rep(letters[1:2], length.out=n()))%>% 
                     unite(indx2Var, indx2,Var, sep=".") %>% 
                     spread(indx2Var, Val)
  #  indx a.col1 a.col2 a.col3 a.col4 b.col1 b.col2 b.col3 b.col4
  #1    1     a1     a2     a3     a4     b1     b2     b3     b4

 as.data.frame.list(c(as.matrix(df)))

您可以使用 setNamespaste 来更改 column names

 as.data.frame.list(setNames(c(as.matrix(df)),
         paste0(letters[1:2], '.', rep(paste0('col',1:4),each=2))))
 # a.col1 b.col1 a.col2 b.col2 a.col3 b.col3 a.col4 b.col4
 #1     a1     b1     a2     b2     a3     b3     a4     b4

  df2 <- cbind(df[1,], df[2,])
  df2[order(colnames(df2))] #and change the column names

数据

df <- structure(list(col1 = c("a1", "b1"), col2 = c("a2", "b2"),
  col3 = c("a3", "b3"), col4 = c("a4", "b4")), .Names = c("col1", "col2", 
"col3", "col4"), class = "data.frame", row.names = c(NA, -2L))