Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 每5行将一列转换为新列(数字间隔)_R_Multiple Columns - Fatal编程技术网

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

R 每5行将一列转换为新列(数字间隔),r,multiple-columns,R,Multiple Columns,我有一个很长的专栏,里面有很多分析的结果(作为一个.txt文件,我将用R读取)。从顶部开始,前5行是对应于Sample1的结果,第二块5行(第6、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

我有一个很长的专栏,里面有很多分析的结果(作为一个.txt文件,我将用R读取)。从顶部开始,前5行是对应于Sample1的结果,第二块5行(第6、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个数字对应于样本1,第二个对应于样本2。我想这样做:

0.01 0.78
0.02 0.08
0.45 0.49
0.34 0.50
0.55 0.33
总的来说,我想将该列向量转换为一个矩阵,其中每列有5行,这些数字的顺序与原始向量中的顺序相同。就像你把原始向量切成5行,然后按顺序粘贴到右边。我搜索过将一列拆分为多列的命令,但它们使用了可以识别字符模式的东西。这是另一种情况。 我在终端上也发现了这一点,但我想知道R中是否有一种方法可以做到这一点,而且可能更简单


是否有一种方法严格地每5行执行一次?是的,您可以执行以下操作:

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

其中x=行数/5;在你的例子中,x=2,因为你有10个观察值,我们可以使用
矩阵来构造它

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的倍数,则使用
tidyverse
中的
spread
dcast
from
data.table
restrape2

数据
df1如果数据位于名为
dtf
的数据框中,则可以使用
dtf$sample添加一列样本号
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))