如何在同一data.table中对两个组执行操作,其中两个组都需要在j字段中引用

时间:2016-04-05 21:50:23

标签: r data.table

如何使用800到700通道的比例创建新列?我发现自己经常遇到这些类型的问题,有更复杂的data.tables。其他例子是从同一时间的700通道中减去同一时间的800通道。

示例:

kdat <- data.table(channel=c(rep(c(700,800), each = 3)),
                   time=c(rep(1:3,2)),
                   value=c(1:6))

     channel time value
1:     700    1     1
2:     700    2     2
3:     700    3     3
4:     800    1     4
5:     800    2     5
6:     800    3     6

我能看到的选项是:
1.)从长格式移到宽格式然后分割,然后转换回长格 - 不喜欢因为必须在长而宽之间来回走动 注意:我回去很久以后我想将所有数据保存在一起,并且可以从单个data.table完成所有绘图。

2。)kdat [channel == 800,。(value)] / kdat [channel == 700,。(value)]
- 不喜欢这样,因为没有检查以确保相同的时间等匹配。

3。)有没有办法用.SD或其他我失踪的方式来做?

期望的输出:

  channel time value ratio
1: 700     1    1     4
...
6: 800     3    6     2

2 个答案:

答案 0 :(得分:2)

我可能会这样做

setkey(kdat, time)
kdat[ 
  dcast(kdat, time~channel, value="value")[, rat := `800`/`700`], 
  rat := i.rat
]

所以你要从长到大,但只在这个用于合并的临时表中,并且只有三个相关的列(时间,通道和值)。

如果你确定每一个频道出现在另一个频道上,你就可以

kdat[order(channel, time), rat := with(split(value, channel), `800`/`700`)]

答案 1 :(得分:0)

好吧,如果你必须使用.SD:)

kdat[, copy(.SD)[.SD[channel == 800
                     ][.SD[channel == 700],
                     rat := value / i.value, on='time'
                     ], rat := i.rat, on='time']][]