首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用setdiff的r data.table聚合函数

使用setdiff的r data.table聚合函数
EN

Stack Overflow用户
提问于 2022-09-25 00:02:00
回答 1查看 39关注 0票数 0

我有一个包含三列的data.table,需要进行复杂的聚合:

代码语言:javascript
复制
> c
                sample     group  symbol
   1:        APPL/S Up  CBEbrown   Icosl
   2:        APPL/S Up  CBEbrown   Ampd3
   3:        APPL/S Up  CBEbrown   Thbs2
   4:        APPL/S Up  CBEbrown  Map4k4
   5:        APPL/S Up  CBEbrown Slc45a3
  ---
1724: APPL/S_BD10-2 Up TCXyellow   Nfxl1
1725: APPL/S_BD10-2 Up TCXyellow    Rhog
1726: APPL/S_BD10-2 Up TCXyellow   Wipf1
1727: APPL/S_BD10-2 Up TCXyellow Selenos
1728: APPL/S_BD10-2 Up TCXyellow  Kdelr2

因此,sample有两个结果,每个结果有7个groups。基本上,需要"APPL/S _ and 10-2 Up“中的fsetdiff of symbols,而不是”APPL/S Up“中的symbols

代码语言:javascript
复制
setdiff(c[group == "TCXyellow" & sample == "APPL/S_BD10-2 Up", symbol], 
        c[group == "TCXyellow" & sample == "APPL/S Up", symbol])

但是我想计算每个符号,fsetdiff发生了多少个fsetdiff(从0到7可能)。输出结果如下:

代码语言:javascript
复制
> out = c[, N_diff := fsetdiff(?????), by="symbol"]
> out
      symbol  N_diff
  1:   Icosl       4
  2:   Ampd3       5
  3:   Thbs2       7
  4:  Map4k4       4
  5: Slc45a3       4
 ---
503:  Unc13d       1
504:   Rpl30       1
505:    Tpt1       1
506:  Garre1       1
507: Selenos       1

7组中有4组Icosl处于"APPL/S _ in 10-2 Up“,而不是”APPL/S Up“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-25 01:57:26

我想你可以这样做:

代码语言:javascript
复制
f <- function(sam,sym) setdiff(sym[sam!="APPL/S UP"], sym[sam=="APPL/S UP"])

df[,.(symbol = f(sample,symbol)),group][, .(N_diff = uniqueN(group)),symbol]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73841314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档