【问题标题】:Transpose of certain related columns in RR中某些相关列的转置
【发布时间】:2018-10-13 13:14:49
【问题描述】:

我是 R 的新手。我试图在没有运气的情况下对数据帧进行转置。尝试使用 t(dataframe), melt(dataframe) 但没有得到我想要的输出。

原始数据框如下

CAT1   CAT2   VAL1   VAL2
A1     A2     BLUE   BLUE
B1     B2     GREEN  GREEN
C1     C2     BLUE   BLUE

我想以这种方式转置这个数据框,使其看起来像下面这样,并且 VAL1 和 VAL2 工作于分组变量。

VAL    CAT

BLUE   A1    
       A2
BLUE   C1
       C2
GREEN  B1
       B2

我想知道这是否可以实现。

这是创建第一个数据集的代码:

dt <-data.frame('CAT1' = c('A1','B1','C1'),
                'CAT2' = c('A2','B2','C2'),
                'VAL1' = c('BLUE','RED','GREEN'),
                'VAL2' = c('BLUE','RED','GREEN'), stringsAsFactors = FALSE)

提前致谢。

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    我认为reshape 会让你靠近。

    dt_long <- reshape(dt, varying = list(c('CAT1','CAT2'),
                                          c('VAL1','VAL2')), 
                           sep = "",
                           direction = "long")
    dt_long
    #    time CAT1  VAL1 id
    #1.1    1   A1  BLUE  1
    #2.1    1   B1   RED  2
    #3.1    1   C1 GREEN  3
    #1.2    2   A2  BLUE  1
    #2.2    2   B2 BLACK  2
    #3.2    2   C2   RED  3
    

    现在您需要排除不需要的列,如dt_long[, c("CAT1", "VAL1")]

    此外,如果您的列名是“CAT1, CAT2, ... CATn”,而不是输入 n 个名称,请执行 paste0("CAT", 1:n)


    更新

    根据新的需求,我们可以创建列VAL

    dt_long$VAL <- c(rbind(unique(dt_long$VAL1), NA))
    #    CAT1  VAL1   VAL
    #1.1   A1  BLUE  BLUE
    #1.2   A2  BLUE  <NA>
    #2.1   B1   RED   RED
    #2.2   B2   RED  <NA>
    #3.1   C1 GREEN GREEN
    #3.2   C2 GREEN  <NA>
    

    此外,我们可以生成向量c("VAL11, VAL12, VAL21, VAL22, VAL31, VAL32")

    paste0("VAL", c(sapply(1:3, paste0, 1:2)))
    #[1] "VAL11" "VAL12" "VAL21" "VAL22" "VAL31" "VAL32"
    

    希望这会有所帮助。

    【讨论】:

    • 嗨@mar​​kus,感谢您的帮助,但是看着您的评论,我觉得我需要编辑我之前提出的问题。所以我编辑了这个问题。请看看,如果可以的话,让我做,再次感谢
    • @HelenNdp 抱歉耽搁了。你想要那些空白单元格是什么?空字符串,即""NAs?我推荐NAs。
    • 嗨@mar​​kus,是的,谢谢 NA 会很好,这只是为了便于查看,所以想让它看起来像一个团体。我还有一个问题。因为我有 VAL 1 和 VAL2 这就是为什么代码工作得很好,但如果它像VAL11VAL12VAL21VAL22VAL31VAL32,我应该放varying = list(c('CAT1','CAT2'),c('VAL11','VAL12'),c('VAL21','VAL22'),c('VAL31','VAL32'))。虽然这似乎不是一个好主意。
    • @HelenNdp 更新了答案。如果有什么不清楚或丢失,请告诉我。最佳
    猜你喜欢
    • 2016-07-08
    • 2018-09-30
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2019-08-07
    • 2016-06-16
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多