R:转置两列数据表

时间:2019-04-25 21:08:07

标签: r data.table transpose

我正在尝试转置两列数据表。 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)时,它起作用了,并给了我数据列的总和。我不确定为什么我尝试的方法不起作用。

所以我的问题是,如何转置该数据表?

1 个答案:

答案 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