将data.table的一列除以整数,取决于R中的另一列

Vin*_*fer 0 r data.table

我有data.table以下格式的R:

     COHORT      VARTYPE  SUM
  1:     RA          CDS   25
  2:     RA       INTRON 1152
  3:     RA        DONOR    0
  4:     RA     ACCEPTOR    1
  5:     RA TSS-UPSTREAM   98
 ---                         
101:    YRI      DISRUPT    0
102:    YRI  UNKNOWN-INC  979
103:    YRI         MIRB    0
104:    YRI         PFAM    8
105:    YRI     CGA_MIRB    0
Run Code Online (Sandbox Code Playgroud)

COHORT列中,有5个值.他们是RA,LupusCEU,YRIASW.

我希望DT$SUM根据值的不同,将列除以一个不同的整数DT$COHORT.

特别,

If DT[COHORT=="RA"]   then  DT$SUM<-(DT$SUM/62)
If DT[COHORT=="Lupus"]   then  DT$SUM<-(DT$SUM/62)
If DT[COHORT=="YRI"]   then  DT$SUM<-(DT$SUM/80)
If DT[COHORT=="CEU"]   then  DT$SUM<-(DT$SUM/96)
If DT[COHORT=="ASW"]   then  DT$SUM<-(DT$SUM/5)
Run Code Online (Sandbox Code Playgroud)

然而到目前为止,我所拥有的语法只能成功地将整个列除以给定的整数,但只有DT$SUM具有所需值的部分DT$COHORT应该被划分...

谢谢

Aru*_*run 6

data.table,你可以,类似于@ alexis_laz的答案(+1),创建另一个(查找)表,只是执行连接并重新计算SUM如下:

首先,我们将生成一些数据(从@alexis_laz借用和修改一下):

require(data.table)
set.seed(101)
dat = data.table(COHORT = sample(c("RA", "Lupus", "YRI", "CEU", "ASW"), 1e5, TRUE), 
                 SUM = sample(100, 1e5, TRUE))
Run Code Online (Sandbox Code Playgroud)

由于分工将导致SUM成为numeric(并且是integer目前),我们将在这里明确地将其转换,从而避免从警告data.table).然后我们将设置加入的密钥.

dat[, SUM := as.numeric(SUM)]
setkey(dat, COHORT)
Run Code Online (Sandbox Code Playgroud)

然后我们创建data.table(一个查找),它具有要除以的值:

ii = data.table(COHORT=c("RA", "Lupus", "YRI", "CEU", "ASW"), 
                val = as.integer(c(62, 62, 80, 96, 5)))
Run Code Online (Sandbox Code Playgroud)

现在,我们执行join如下操作(此处显示当前CRAN版本和将来的data.table版本):

dat[ii, SUM := SUM/val]            ## v <= 1.9.2 - implicit by or by-without-by

dat[ii, SUM := SUM/val, by=.EACHI] ## v >= 1.9.3 - explicit by
Run Code Online (Sandbox Code Playgroud)