【发布时间】:2016-12-01 14:57:47
【问题描述】:
假设我们有,
library(data.table)
dt <- data.table(id = 1:4, x1 = 10:13, x2=21:24, wt=c(1,0,0.5,0.7))
返回,
id x1 x2 wt
1: 1 10 21 1.0
2: 2 11 22 0.0
3: 3 12 23 0.5
4: 4 13 24 0.7
我想在以下条件下复制观察结果:
- 如果
wt为0 或1,我们将flag分别赋值为1 和0 - 如果 0 wt flag 赋值为 0。此外,我们使用
wt = 1-wt复制此观察结果并将flag赋值为 1。
我期望的回报是
id x1 x2 wt flag
1: 1 10 21 1.0 0
2: 2 11 22 0.0 1
3: 3 12 23 0.5 0
4: 3 12 23 0.5 1
5: 4 13 24 0.7 0
6: 4 13 24 0.3 1
我已经尝试过我的代码
dt[,flag:=ifelse(wt==1,0, ifelse(wt==0, 1, 0))]
dt[,freq:=ifelse(wt > 0 & wt < 1, 2, 1)]
dtr <- dt[rep(1:.N, freq)][,Indx:=1:.N, by = id]
dtr[freq==2&Indx==2, wt:=1-wt]
dtr[Indx==2,flag:=1]
dtr[,`:=`(freq=NULL, Indx=NULL)]
但是,我认为它没有效率。
你有什么建议吗?
【问题讨论】:
-
在
data.table中按行工作将是低效的。我建议使用baseR 解决方案。
标签: r data.table