Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 删除多个数据表中的行并保存到原始数据表_R_Datatable_Lapply - Fatal编程技术网

R 删除多个数据表中的行并保存到原始数据表

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("

我想将多个数据表子集为对应于唯一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("...", "...", "..."), 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