【问题标题】:Turning one row into multiple rows in r [duplicate]在r中将一行变成多行[重复]
【发布时间】:2015-06-17 16:09:53
【问题描述】:

在 R 中,我有每个人有多个会话日期的数据,以及一些测试的分数,但这些都在一行中。我想更改它,以便我有多个包含人员信息的行,但只有一个会话日期和相应的考试成绩,并为每个人执行此操作。此外,每个人可能完成了不同数量的会话。

例如:

ID  Name  Session1Date  Score  Score  Session2Date  Score  Score
23  sjfd  20150904      2      3      20150908      5      7
28  addf  20150905      3      4      20150910      6      8

收件人:

ID  Name  SessionDate  Score  Score
23  sjfd  20150904     2      3     
23  sjfd  20150908     5      7
28  addf  20150905     3      4
28  addf  20150910     6      8

【问题讨论】:

    标签: r multiple-columns transpose


    【解决方案1】:

    您可以使用data.table 的开发版本中的melt,即。 v1.9.5。它可以将多个“度量”列作为一个列表。安装说明为here

    library(data.table)#v1.9.5+
    melt(setDT(df1), measure = patterns("Date$", "Score(\\.2)*$", "Score\\.[13]"))
    #   ID Name variable   value1 value2 value3
    #1: 23 sjfd        1 20150904      2      3
    #2: 28 addf        1 20150905      3      4
    #3: 23 sjfd        2 20150908      5      7
    #4: 28 addf        2 20150910      6      8
    

    或者使用base R中的reshape,我们可以将direction指定为'long',将varying指定为列索引的list

     res <- reshape(df1, idvar=c('ID', 'Name'), varying=list(c(3,6), c(4,7), 
             c(5,8)), direction='long')
     res  
     #            ID Name time Session1Date Score Score.1
     #23.sjfd.1 23 sjfd    1     20150904     2       3
     #28.addf.1 28 addf    1     20150905     3       4
     #23.sjfd.2 23 sjfd    2     20150908     5       7
     #28.addf.2 28 addf    2     20150910     6       8
    

    如果需要,rownames 可以更改

     row.names(res) <- NULL 
    

    更新

    如果列遵循特定顺序,即第 3 与第 6、第 4 与第 7、第 5 与第 8 组,我们可以创建列索引的matrix,然后创建split 以获取listvarying reshape 中的参数。

     m1 <- matrix(3:8,ncol=2)
     lst <- split(m1, row(m1))
     reshape(df1, idvar=c('ID', 'Name'), varying=lst, direction='long')
    

    【讨论】:

    • 因为我有 625 列,有没有办法在不输入所有变量名的情况下做到这一点?
    • @Michael 你可以使用splitstackshape 中的merged.stack,但是我们需要有一些通用列名的模式,或者我们需要知道列是否遵循特定的顺序
    • @Michael 如果列遵循示例中的特定顺序,我更新了一个可能的选项。在拆分矩阵中创建的“度量”列的列索引后,我们创建一个list
    • 对不起,我对 R 很陌生,但是在你使用 reshape 的回答中,什么是变量 = 列表指定,我似乎无法弄清楚这些数字对应的是什么?跨度>
    • @Swanny,查看更新的解决方案。您可以借助patterns() 函数在melt 中使用正则表达式。
    【解决方案2】:

    如果您的数据框名称是data

    使用这个

    data1 <- data[1:5]
    data2 <- data[c(1,2,6,7,8)]
    newdata <- rbind(data1,data2)
    

    这适用于您给出的示例。您可能需要在 data1 和 data2 中适当地更改列名以获得正确的rbind

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-24
      • 2020-01-22
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多