首页 文章

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

提问于
浏览
3

我有一个长列,其中包含大量分析结果(作为.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个数字对应Sample1,第二个数字对应Sample2 . 我想做这个:

0.01 0.78
0.02 0.08
0.45 0.49
0.34 0.50
0.55 0.33

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

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

2 回答

  • 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的倍数,则使用 tidyverse 中的 spreaddata.table 中的 dcastreshape2

    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))
    
  • 5

    是的你可以做到以下几点:

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

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

相关问题