假设这样的数据,每个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的行数都会很小,所以我认为这是一种理想的扁平化方法。
答案 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='')