r - 在 r 中的 data.table 中折叠具有互补列数据的行
问题描述
我需要折叠 data.table 中的部分重复行
例子:
df.in <- data.table (
tkr = c("abc", "abc", "def", "def", "ghi", "ghi"),
lboq = c(0,296, -390, 0, -88, 0),
locq = c(-296,0, 0, 390, 0, 88),
ap = c(134,134, 23, 23, 17, 17)
)
tkr lboq locq ap
1: abc 0 -296 134
2: abc 296 0 134
3: def -390 0 23
4: def 0 390 23
5: ghi -88 0 17
6: ghi 0 88 17
使用这个例子,我想得到三行,其中第二行折叠成第一行,第 2 列有 296;第 4 行的 390 将位于第 3 行的第 3 列,依此类推。
所以想要的结果是:
df.out <- data.table (
tkr = c("abc", "def", "ghi"),
lboq = c(296, -390, -88),
lbcq = c(-296, 390, 88),
ap = c(134, 23, 17)
)
tkr lboq lbcq ap
1: abc 296 -296 134
2: def -390 390 23
3: ghi -88 88 17
我已经研究了以下反应,表明反应:
尽管有上述两个标题,但它们看起来更像是扩张而不是崩溃
我还在下面探索了使用合并,但这似乎仅适用于列;行有合并吗?
然后我看着
但是这里的折叠已经完成,需要总结;我需要做崩溃
这看起来正是我需要的
但使其适应我的使用似乎不起作用:
df.in %>%
group_by(tkr, ap) %>%
summarise_all(funs(sort(.)[1]))
我错过了什么?
解决方案
也许这会有所帮助:
library(dplyr)
df.in %>%
group_by(tkr) %>%
summarise(across(lboq:ap, ~.x[.x != 0][1]))
# tkr lboq locq ap
#* <chr> <dbl> <dbl> <dbl>
#1 abc 296 -296 134
#2 def -390 390 23
#3 ghi -88 88 17
对于每个tkr
this 选择 columns 中的第一个非零值lboq:ap
。