我有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,Lupus和CEU,YRI和ASW.
我希望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应该被划分...
谢谢
在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)