代码之家  ›  专栏  ›  技术社区  ›  Jepessen

将单个观测数据重新排列为多个

  •  0
  • Jepessen  · 技术社区  · 6 年前

    我有以下格式的文本文件:

    x1, y1, z1, x2, y2, z2, x3, y3, z3
    

    如果我用 read.csv 我只观察了九个变量(在这个例子中,实际文件中三元组的数目是未知的)。

    我想重新排列数据,以便用三个变量进行许多观察:

    x1 y1 z1
    x2 y2 z2
    x3 y3 z3
    

    所以我可以对每个三联体执行操作。

    例如,我想转换这个

    fileData <- read.table(text = "1 2 3 10 20 30 100 200 300")
    
    > fileData
      V1 V2 V3 V4 V5 V6  V7  V8  V9
    1  1  2  3 10 20 30 100 200 300
    

    为此:

    > fileData
       V1  V2  V3
    1   1   2   3
    2  10  20  30
    3 100 200 300
    

    我怎样才能把它分开?

    2 回复  |  直到 6 年前
        1
  •  3
  •   akash87    6 年前

    不确定你的实际目标是什么,但使用基数r:

    data.frame(matrix(fileData, ncol = 3, byrow = T))
    

    这应该得到你想要的

       X1  X2  X3
    1   1   2   3
    2  10  20  30
    3 100 200 300
    
        2
  •  2
  •   Mark    6 年前

    阿卡什给出了一个很好的答案,但是如果您有混合的数据类型(数字和字符),它可能不起作用,因为矩阵将强制所有的东西都是一种类型。另一种选择是如下 lapply 基于所需列数的索引。

    fileData <- read.table(text = "m 2 3 a 20 30 cat 200 300")
    rows = lapply(seq(3,ncol(fileData),by=3),
           function(x){
             range = paste("V",(x-2):x,sep="")
             output = fileData[,range]
             names(output) = c("x","y","z")
             return(output)
           })
    do.call(rbind,rows)
    #>     x   y   z
    #> 1   m   2   3
    #> 2   a  20  30
    #> 3 cat 200 300