通过根据每个ID

时间:2015-10-30 17:12:34

标签: r

假设这样的数据,每个ID有多行:

z <- data.frame(ID = c(1,1,1,2,2,3,4,4),VA=c(1,2,3,1,2,5,7,8),VB=c("a","b","c","a","b","c","b","c"),VC=c(1,2,3,1,2,8,10,12))

ID  VA   VB   VC
1   1    a    1
1   2    b    2
1   3    c    3
2   1    a    1
2   2    b    2
3   5    c    8
4   7    b    10
4   8    c    12

我想折叠为每个ID 1行,我需要的列数足以支持任何Id存在的最大原始行数; (在此示例中,ID = 1的3行):

ID  VA1   VA2   VA3   VB1   VB2   VB3   VC
1   1     2     3     a     b     c      2.0
2   1     2     a     b     NA    NA     1.5
3   5     NA    NA    c     NA    NA     8.0
4   7     8     NA    b     c     NA    15.0

另外,请注意一些列(VA,VB)是如何“展平”的,而其他列(VC)可以聚合。

我不想将任何单元格的值转换为列名,因为值可能变化太大。但是任何给定ID的行数都会很小,所以我认为这是一种理想的扁平化方法。

1 个答案:

答案 0 :(得分:4)

我们可以使用class MyTask(luigi.Task): resources = {"mathplotlib": 1} 中的dcast。我们将'data.frame'转换为'data.table'(data.table),将'VC'列转换为setDT(z)类,将值替换为'VC'的numeric按“ID”分组,并使用可能需要多个mean列的dcast。在devel版本中,可以使用value.var创建序列列。否则,我们可能必须rowid然后使用z[, N:= 1:.N, by = ID]

dcast(z, ID+VC~N, value.var= c('VA', 'VB'), sep='')