我有一个长列,其中包含大量分析结果(作为.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行做一次?
答案 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
中的tidyverse
或dcast
data.table
中的reshape2
{ p>
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))