【问题标题】:How to bind every n columns one under the other as rows (wide to long)? [duplicate]如何将每n列绑定为行(从宽到长)? [复制]
【发布时间】:2020-04-19 14:47:28
【问题描述】:

这是我没有列名的数据集:

ADNAC TI     0.09   ADNAC TI     0.09   ADNAC TI     0.09   ADNAC TI     0.08 
AEFES TI     3.76   AEFES TI     3.48   AEFES TI     3.74   AEFES TI     3.24 
AGHOL TI     0.43   AGHOL TI     0.37   AGHOL TI     0.31   AGHOL TI     0.39 
AGYO TI      0.09   AGYO TI      0.08   AGYO TI      0.08   AGYO TI      0.08 
AKBNK TI     9.21   AKBNK TI     8.30   AKBNK TI     8.26   AKBNK TI     10.57 
AKCNS TI     0.45   AKCNS TI     0.43   AKCNS TI     0.43   AKCNS TI     0.47 
AKENR TI     0.53   AKENR TI     0.46   AKENR TI     0.45   AKENR TI     0.43 

每两列并排代表一天(在本例中为字符串及其各自的值)。总共有 100 行和 382 列,因此是 191 天。我想做的是每天一个接一个地堆叠成行,独立于他们的一天。所以我总共有 100x191 行,只有 2 列,字符串(股票名称)和相应的值。看起来像:

ADNAC TI     0.09 
AEFES TI     3.76 
AGHOL TI     0.43 
AGYO TI      0.09 
AKBNK TI     9.21 
AKCNS TI     0.45 
AKENR TI     0.53 
ADNAC TI     0.09 
AEFES TI     3.48 
AGHOL TI     0.37 
AGYO TI      0.08 
AKBNK TI     8.30 
AKCNS TI     0.43 
AKENR TI     0.46 
ADNAC TI     0.09 
AEFES TI     3.74 
AGHOL TI     0.31 
AGYO TI      0.08 
AKBNK TI     8.26 
AKCNS TI     0.43 
AKENR TI     0.45 
ADNAC TI     0.08 
AEFES TI     3.24 
AGHOL TI     0.39 
AGYO TI      0.08 
AKBNK TI     10.57 
AKCNS TI     0.47 
AKENR TI     0.43 

到目前为止我尝试的是拆分数据:data_long <- split.default(data_wide, rep(1, each = 2))

还有其他几次reshapemelt 的不成功尝试,主要是由于索引问题而失败。我试图通过为股票名称和每天的价值分配 AB 来做到这一点,这将作为 B B1 等等。但是在 Excel 中混合字符串和数字的传播并没有达到我的预期,所以我不得不手动进行,这是没有意义的。

【问题讨论】:

    标签: r split dplyr reshape melt


    【解决方案1】:

    一种简单的方法是使用向量回收来选择备用列,unlist 它们将数据作为向量获取并创建一个新的数据框。

    data.frame(stock = unlist(df[c(TRUE, FALSE)]),value = unlist(df[c(FALSE, TRUE)]), 
                row.names = NULL, stringsAsFactors = FALSE)
    
    
    #     stock value
    #1  ADNACTI  0.09
    #2  AEFESTI  3.76
    #3  AGHOLTI  0.43
    #4   AGYOTI  0.09
    #5  AKBNKTI  9.21
    #6  AKCNSTI  0.45
    #7  AKENRTI  0.53
    #8  ADNACTI  0.09
    #9  AEFESTI  3.48
    #10 AGHOLTI  0.37
    #11  AGYOTI  0.08
    #12 AKBNKTI  8.30
    #13 AKCNSTI  0.43
    #14 AKENRTI  0.46
    

    使用split.default 我们可以做到:

    df[c(TRUE, FALSE)] <- lapply(df[c(TRUE, FALSE)], as.character)
    do.call(cbind.data.frame, lapply(split.default(df, c(TRUE, FALSE)), unlist))
    

    数据

    df <- structure(list(V1 = structure(1:7, .Label = c("ADNACTI", "AEFESTI", 
    "AGHOLTI", "AGYOTI", "AKBNKTI", "AKCNSTI", "AKENRTI"), class = "factor"), 
    V2 = c(0.09, 3.76, 0.43, 0.09, 9.21, 0.45, 0.53), V3 = structure(1:7, 
    .Label = c("ADNACTI","AEFESTI", "AGHOLTI", "AGYOTI", "AKBNKTI", "AKCNSTI", 
    "AKENRTI"), class = "factor"), V4 = c(0.09, 3.48, 0.37, 0.08, 8.3, 
    0.43, 0.46)), class = "data.frame", row.names = c(NA, -7L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2017-12-31
      • 2021-08-30
      • 1970-01-01
      • 2019-09-14
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多