R函数用于cbind单个列的转置

时间:2015-01-03 10:53:18

标签: r

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

我正在寻找一个函数来遍历数据框,并通过向下移动每一列并将其作为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

如果有人能告诉我一个有用的包装或功能,我将非常感激!

1 个答案:

答案 0 :(得分:0)

以下是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))