【问题标题】:Complex data frame transposition in RR中的复杂数据帧转置
【发布时间】:2014-11-19 16:57:02
【问题描述】:

我已尝试为此寻找答案,但大多数 data.frame/matrix 转位并不像我试图完成的那样复杂。基本上我有一个 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 命令来完成,但我完全不知道如何完成它。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你可以试试

    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"))
    

    【讨论】:

    • 好的,这已经足够接近了,不幸的是,当我运行这个时,separate() 会抛出错误; Error: Values not split into 2 pieces at 1, 2, 3...etc.
    • 不错的答案 (+1) - 我想知道你是否可以使用 tidyr,例如gather,替换 melt(as.matrix(df)),这样你就不需要两个包了? (因为我的理解是 tidyr 取代了 reshape2。)
    • @beginneR 谢谢,我正在考虑先使用gather,但后来我必须将行名添加为单独的列,这变得有点难看。
    • @beginneR 我删除了melt 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多