每5行将一列转换为新列(数字间隔)

时间:2017-02-23 15:23:16

标签: r multiple-columns

我有一个长列,其中包含大量分析结果(作为.txt文件,我将用R读取)。从顶部开始,前5行是对应于Sample1的结果,第5行(5行,7,8,9和10)对应于Sample2,依此类推,从Sample1到Sample57。所以,我想把那个长列分成57列,按样本分开。 让我们从一个较小的例子开始,简化问题,只使用前两个样本(因此,列只有10个值,每个5个)。假设我们有这个列向量:

0.01
0.02
0.45
0.34
0.55
0.78
0.08
0.49
0.50
0.33

我知道前5个数字对应Sample1,第二个数字对应Sample2。我想这样做:

0.01 0.78
0.02 0.08
0.45 0.49
0.34 0.50
0.55 0.33

总的来说,我希望将该柱状矢量转换为矩阵,其中每列长度为5行,并且这些数字与原始矢量中的数字顺序相同。就像你将原始矢量切成5个长的片段,然后将它们按顺序粘贴在右边。我搜索过命令将一列拆分成多列,但是他们使用了识别字符模式的东西。这是一种不同的情况。 我也发现这个关于终端Put every N rows of input into a new column,但我想知道R中是否有办法做到这一点,也许也更简单。

有没有办法严格每5行做一次?

2 个答案:

答案 0 :(得分:5)

是的,你可以这样做:

as.data.frame(split(data, 1:x))

其中x = nr行/ 5;在你的例子x = 2,因为你有10个观察

答案 1 :(得分:3)

我们可以使用matrix构建此

matrix(df1[,1], nrow=5, ncol=2)
#    [,1] [,2]
#[1,] 0.01 0.78
#[2,] 0.02 0.08
#[3,] 0.45 0.49
#[4,] 0.34 0.50
#[5,] 0.55 0.33

如果行数不是5的倍数,则使用spread中的tidyversedcast data.table中的reshape2

library(tidyverse)
df1 %>%
    mutate(i1 = rep(1:5, length.out=n()), grp = paste0("Col", cumsum(i1==1))) %>%
    spread(grp, Col1) %>%
    select(-i1)
#  Col1 Col2
#1 0.01 0.78
#2 0.02 0.08
#3 0.45 0.49
#4 0.34 0.50
#5 0.55 0.33

数据

df1 <- structure(list(Col1 = c(0.01, 0.02, 0.45, 0.34, 0.55, 0.78, 0.08, 
 0.49, 0.5, 0.33)), .Names = "Col1", class = "data.frame", row.names = c(NA, 
-10L))