R数据表:(动态)前瞻性交叉联接

R数据表:(动态)前瞻性交叉联接,r,data.table,cross-join,R,Data.table,Cross Join,我想知道data.table中的CJ方法是否有一个选项,用于获取由计算条件形成的向量,而不是运行完全交叉联接 资料 其中,我添加了cat_high,以指示在低/高中加入了哪两个类别 不幸的是,我找不到正确的方法来修改我的完全交叉连接df[,CJlow=low,high=high,by=.ID],使其行为如下。非常感谢您的帮助/提示。我想您可以通过.EACHI在非对等连接中完成此操作。然后您可以使用i。选择从哪个表获取输出变量的前缀: df[, c(.SD,.(larger_cat=cat))][

我想知道data.table中的CJ方法是否有一个选项,用于获取由计算条件形成的向量,而不是运行完全交叉联接

资料

其中,我添加了cat_high,以指示在低/高中加入了哪两个类别


不幸的是,我找不到正确的方法来修改我的完全交叉连接df[,CJlow=low,high=high,by=.ID],使其行为如下。非常感谢您的帮助/提示。

我想您可以通过.EACHI在非对等连接中完成此操作。然后您可以使用i。选择从哪个表获取输出变量的前缀:

df[, c(.SD,.(larger_cat=cat))][
  df, on=.(ID==ID, cat > cat), .(larger_cat, low=i.low, high), by=.EACHI, nomatch=0
]

#    ID  cat larger_cat    low   high
#1:  18 1300       1320 24.625 17.500
#2:  18 1300       1325 24.625 15.500
#3:  18 1320       1325 16.250 15.500
#4:  74 1300       1325 58.250 47.375
#5: 165 1300       1325 90.750 79.875
不是dplyr解决方案,但我认为以下是另一种选择

library(dplyr)
library(tidyr)

df2 <- df %>%
  group_by(ID) %>%
  complete(low, high) %>%
  mutate(cat_large = cat) %>%
  group_by(ID, low) %>%
  mutate(cat = na.omit(cat)) %>%
  group_by(ID, high) %>%
  mutate(cat_large = na.omit(cat_large)) %>%
  filter(low > high) %>%
  arrange(ID, desc(low), desc(high)) %>%
  select(ID, cat, cat_large, low, high)
df2
# A tibble: 5 x 5
# Groups:   ID, high [4]
     ID   cat cat_large    low   high
  <int> <int>     <int>  <dbl>  <dbl>
1    18  1300      1320 24.625 17.500
2    18  1300      1325 24.625 15.500
3    18  1320      1325 16.250 15.500
4    74  1300      1325 58.250 47.375
5   165  1300      1325 90.750 79.875
单向:

df[, c(
  CJ(cat = cat, lcat = cat, sorted = FALSE),
  CJ(low = low, high = high, sorted = FALSE)  
), by=ID][lcat > cat]

    ID  cat lcat    low   high
1:  18 1300 1320 24.625 17.500
2:  18 1300 1325 24.625 15.500
3:  18 1320 1325 16.250 15.500
4:  74 1300 1325 58.250 47.375
5: 165 1300 1325 90.750 79.875

我觉得我应该可以这样做:df[df,on=.ID==ID,cat>cat,.large_cat=x.cat,low=I.low,high,by=.EACHI,nomatch=0]但是由于一些未知的原因,这打破了我的高低输出。我不确定,你的评论,但我确实注意到I.*和x.*向量的长度不同,比较df[df,on=.ID=.cat>cat,lengthi.low,by=.EACHI,nomatch=0]和df[df,on=.ID==ID,cat>cat,lengthhigh,by=.EACHI,nomatch=0]如果这是唯一的问题,也许代表或第一个将解决它…?谢谢@thelatemail!这工作速度非常快,我很可能最终使用它为我的目的。我已经勾选了Frank的答案,它实现了同样的目的,但为我的目的需要更长的时间,尽管万一未来的读者正在寻找CJ解决方案,如我的q所示我很感激你的工作!
library(dplyr)
library(tidyr)

df2 <- df %>%
  group_by(ID) %>%
  complete(low, high) %>%
  mutate(cat_large = cat) %>%
  group_by(ID, low) %>%
  mutate(cat = na.omit(cat)) %>%
  group_by(ID, high) %>%
  mutate(cat_large = na.omit(cat_large)) %>%
  filter(low > high) %>%
  arrange(ID, desc(low), desc(high)) %>%
  select(ID, cat, cat_large, low, high)
df2
# A tibble: 5 x 5
# Groups:   ID, high [4]
     ID   cat cat_large    low   high
  <int> <int>     <int>  <dbl>  <dbl>
1    18  1300      1320 24.625 17.500
2    18  1300      1325 24.625 15.500
3    18  1320      1325 16.250 15.500
4    74  1300      1325 58.250 47.375
5   165  1300      1325 90.750 79.875
df[, c(
  CJ(cat = cat, lcat = cat, sorted = FALSE),
  CJ(low = low, high = high, sorted = FALSE)  
), by=ID][lcat > cat]

    ID  cat lcat    low   high
1:  18 1300 1320 24.625 17.500
2:  18 1300 1325 24.625 15.500
3:  18 1320 1325 16.250 15.500
4:  74 1300 1325 58.250 47.375
5: 165 1300 1325 90.750 79.875