R中的复杂数据帧转置

时间:2014-11-19 16:57:03

标签: r dataframe

我已经尝试过为此寻找答案,但大多数data.frame / matrix transpoitions并不像我想要的那样复杂。基本上我有一个看起来像

的data.frame
          F    M    A
2008_b    1    5    6
2008_r    3    3    6
2008_a    4    1    5
2009_b    1    1    2
2009_r    5    4    9
2009_a    2    2    4

我试图转置它并重命名列和行名称:

          F_b  M_b  A_b  F_r  M_r  A_r  F_a  M_a  A_a
2008        1    5    6    3    3    6    4    1    5
2009        1    1    2    5    4    9    2    2    4

基本上每三行都会折叠成一行。我认为这可以通过一些聪明的plyr或reshape2命令完成,但我完全失去了如何实现它。

1 个答案:

答案 0 :(得分:3)

你可以尝试

library(dplyr)
library(tidyr)

lvl <- c(outer(colnames(df), unique(gsub(".*_", "", rownames(df))), 
                       FUN=paste, sep="_"))


res <- cbind(Var1=row.names(df), df) %>%
                              gather(Var2, value, -Var1) %>% 
                              separate(Var1, c('Var11', 'Var12')) %>%
                              unite(VarN, Var2, Var12) %>%
                              mutate(VarN=factor(VarN, levels=lvl)) %>%
                              spread(VarN, value)

row.names(res) <- res[,1]
res1 <- res[,-1]
res1
#     F_b M_b A_b F_r M_r A_r F_a M_a A_a
#2008   1   5   6   3   3   6   4   1   5
#2009   1   1   2   5   4   9   2   2   4

数据

df <- structure(list(F = c(1L, 3L, 4L, 1L, 5L, 2L), M = c(5L, 3L, 1L, 
1L, 4L, 2L), A = c(6L, 6L, 5L, 2L, 9L, 4L)), .Names = c("F", 
"M", "A"), class = "data.frame", row.names = c("2008_b", "2008_r", 
"2008_a", "2009_b", "2009_r", "2009_a"))