如何将每 n 列一个接一个地绑定为行(从宽到长)?

How to bind every n columns one under the other as rows (wide to long)?

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

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 中混合的字符串和数字传播并没有达到我的预期,所以我不得不手动进行,这是毫无意义的。

一种简单的方法是使用向量回收到 select 备用列,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))