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

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

如何创建一个比率为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:     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']][]