R 删除多个数据表中的行并保存到原始数据表
我想将多个数据表子集为对应于唯一ID的记录。类似的螺纹为和;如果我分别对每个数据表进行编程,这些解决方案就可以工作,但我希望在我拥有的所有数据表上运行代码 我的数据如下所示:R 删除多个数据表中的行并保存到原始数据表,r,datatable,lapply,R,Datatable,Lapply,我想将多个数据表子集为对应于唯一ID的记录。类似的螺纹为和;如果我分别对每个数据表进行编程,这些解决方案就可以工作,但我希望在我拥有的所有数据表上运行代码 我的数据如下所示: dt1 <- data.table(var1 = c("A", "B", "C"), var2 = c("...", "...", "..."), id = c("101", "105", "105")) dt2 <- data.table(var1 = c("D", "E", "F"), var2 = c("
dt1 <- data.table(var1 = c("A", "B", "C"), var2 = c("...", "...", "..."), id = c("101", "105", "105"))
dt2 <- data.table(var1 = c("D", "E", "F"), var2 = c("...", "...", "..."), var3 = c("...", "...", "..."), id = c("110", "110", "139"))
dt3 <- data.table(var1 = c("B", "G", "H"), id = c("105", "113", "113"))
> dt1
var1 var2 id
1: A ... 101
2: B ... 105
3: C ... 105
> dt2
var1 var2 var3 id
1: D ... ... 110
2: E ... ... 110
3: F ... ... 139
> dt3
var1 id
1: B 105
2: G 113
3: H 113
我可以使用
dt1成功地将每个数据表分别子集,这可能不是最好的方法,尽管它解决了您的问题。有时我们无法避免for
循环
y=c("dt1","dt2","dt3")
for(i in 1:3){
assign(y[i],(get(y[i])[, if(.N==1) .SD, by = id]))
}
现在试着调用dt1,其余的可能不是最好的方法,尽管它解决了您的问题。有时我们无法避免for
循环
y=c("dt1","dt2","dt3")
for(i in 1:3){
assign(y[i],(get(y[i])[, if(.N==1) .SD, by = id]))
}
现在尝试调用dt1,其余的这里是另一个重复的选项。我们使用mget
获取列表中对象的值,然后使用duplicated
删除“id”重复的行。最好将其保存在列表中,但如果需要,则使用list2env
list2env(lapply(mget(paste0("dt", 1:3)),
function(x) x[!(duplicated(id)|duplicated(id, fromLast=TRUE))]), .GlobalEnv)
dt1
# var1 var2 id
#1: A ... 101
dt2
# var1 var2 var3 id
#1: F ... ... 139
dt3
# var1 id
#1: B 105
这里是另一个重复的选项。我们使用mget
获取列表中对象的值,然后使用duplicated
删除“id”重复的行。最好将其保存在列表中,但如果需要,则使用list2env
list2env(lapply(mget(paste0("dt", 1:3)),
function(x) x[!(duplicated(id)|duplicated(id, fromLast=TRUE))]), .GlobalEnv)
dt1
# var1 var2 id
#1: A ... 101
dt2
# var1 var2 var3 id
#1: F ... ... 139
dt3
# var1 id
#1: B 105