我正在尝试转置两列数据表。 dt就是这样。
access.id | data
1 0
1 0
2 150
... ...
我想要的就是这样。
access.id | V1 | V2
1 0 0
2 150 ...
我尝试了不同的方法,但似乎无法获得想要的结果。
test[, lapply(.SD, .fun=function(dt) { return (transpose(dt)) }) , by = access.id]
或
test[, lapply(.SD, .fun=function(dt) { return (transpose(dt[data])) }) , by = access.id]
或
test[, .SD[, transpose(data)] , by = access.id]
上面给我一个错误:“ transpose(dt)中的错误:l必须是列表。”
test[, lapply(.SD, .fun=function(dt) { return (transpose(dt$data)) }) , by = access.id]
这将导致错误:'dt $ data中的错误:$运算符对原子向量无效”
test[, .SD[, t(data)] , by = access.id]
这行得通,但给了我完全相同的数据表。
当我尝试用t(data)代替sum(data)时,它起作用了,并给了我数据列的总和。我不确定为什么我尝试的方法不起作用。
所以我的问题是,如何转置该数据表?
答案 0 :(得分:3)
您可以添加行ID,然后使用该新列作为公式的右侧来添加CUSTARTLINK
。
dcast
这一步也可以实现
df[, rid := paste0('V', rowid(access.id))]
dcast(df, access.id ~ rid, value.var = 'data')
# access.id V1 V2
# 1: 1 0 0
# 2: 2 150 300
说明:
dcast(df, access.id ~ paste0('V', rowid(access.id)), value.var = 'data')
是“用于在每个组内生成唯一行ID的便捷功能”。它采用一个向量rowid
并创建一个向量,该向量从1开始并在每次再次看到相同的x
值时递增1,并且在新值{{1}时从1开始}。
x
如果没有命令x
,则上面的解释会有些欠缺,但是老实说,我不确定如何很好地解释这种情况。也许这个例子会有所帮助。
df[, rid := paste0('V', rowid(access.id))][]
# access.id data rid
# 1: 1 0 V1
# 2: 1 0 V2
# 3: 2 150 V1
# 4: 2 300 V2
由于您希望每个组的每一行都作为其自己的列,因此可以将此新的x
变量放在data.table(c('a', 'a', 'b', 'a', 'b', 'b', 'a'),
rowid(c('a', 'a', 'b', 'a', 'b', 'b', 'a')))
# V1 V2
# 1: a 1
# 2: a 2
# 3: b 1
# 4: a 3
# 5: b 2
# 6: b 3
# 7: a 4
公式的右侧。 rid
希望您将所需的列放在右侧,而将相应的行放在左侧。 (不是最好的解释,请参见dcast
。)
使用的数据
dcast