首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将每个n列(宽到长)彼此绑定为行?

如何将每个n列(宽到长)彼此绑定为行?
EN

Stack Overflow用户
提问于 2020-04-19 14:47:28
回答 1查看 61关注 0票数 1

下面是一个没有列名的数据集:

代码语言:javascript
复制
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列,字符串(股票名)和相应的值。看起来就像:

代码语言:javascript
复制
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的失败尝试,这主要是由于索引问题导致的失败。我试图通过为每天的股票名称和价值分配A、B来实现这一点,这将继续作为B、B1等等。但是,混合字符串和数字在Excel中传播并没有达到我的预期,所以我不得不手动执行,这是没有意义的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 14:52:47

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

代码语言:javascript
复制
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,我们可以做到:

代码语言:javascript
复制
df[c(TRUE, FALSE)] <- lapply(df[c(TRUE, FALSE)], as.character)
do.call(cbind.data.frame, lapply(split.default(df, c(TRUE, FALSE)), unlist))

数据

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61306264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档