R 如何对同一data.table中的两个组执行操作,其中两个组都需要在j字段中引用
如何创建一个比率为800到700频道的新列?我发现自己经常遇到这些类型的问题,数据表要复杂得多。其他示例是从同一时间的700个通道中减去同一时间的800个通道 例如:R 如何对同一data.table中的两个组执行操作,其中两个组都需要在j字段中引用,r,data.table,R,Data.table,如何创建一个比率为800到700频道的新列?我发现自己经常遇到这些类型的问题,数据表要复杂得多。其他示例是从同一时间的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: 70
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
我可能会的
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`)]
好吧,如果必须使用的话。SD:)
kdat[,value[channel==800]/value[channel==700],by=time]
?@MichaelChirico是的,稍微修改一下以获得所需的输出:kdat[,ratio:=value[channel==800]/value[channel==700],by=time]
不确定这是否是OP已经想到的问题#1。
kdat[order(channel, time), rat := with(split(value, channel), `800`/`700`)]
kdat[, copy(.SD)[.SD[channel == 800
][.SD[channel == 700],
rat := value / i.value, on='time'
], rat := i.rat, on='time']][]