如何使用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
答案 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']][]