删除存储在列表中的数据帧内和数据帧之间的重复行

问题描述 投票:0回答:1

数据框列表:

my_list <- list(structure(list(id = c("xxxyz", 
                                         "xxxyz", "zzuio"), country = c("USA", 
                                                                                                     "USA", "Canada")), class = "data.frame", row.names = c(NA, -3L)), 
                structure(list(id = c("xxxyz", "ppuip", 
                                         "zzuio"), country = c("USA", "Canada", "Canada")), class = "data.frame", row.names = c(NA, 
                                                                                                                                    -3L)))

my_list
[[1]]
     id country
1 xxxyz     USA
2 xxxyz     USA
3 zzuio  Canada

[[2]]
     id country
1 xxxyz     USA
2 ppuip  Canada
3 zzuio  Canada

我想删除该列表中存储的数据帧内部和之间的重复行。

可以删除每个数据框中的重复项:

lapply(my_list, function(z) z[!duplicated(z$id),])
[[1]]
     id country
1 xxxyz     USA
3 zzuio  Canada

[[2]]
     id country
1 xxxyz     USA
2 ppuip  Canada
3 zzuio  Canada

但是数据帧之间仍然存在重复。我想将它们全部删除,并获得以下所需的输出:

[[1]]
    id   country
 xxxyz   USA

 [[2]]
    id   country
 ppuip   Canada
 zzuio   Canada

备注:

  1. 我想消除
    id
    上的重复项(其他变量可以重复)
  2. 我需要一个解决方案,在检查重复项之前不需要合并数据框
  3. 如果可以的话,我希望保留最后的观察结果。例如,在上面所需的输出中,“zzuio Canada”存在于两个 df 中,但仅保留在最后一个 df 中,即 df 2。
  4. 我有超过 100 个 dfs,dfs 之间的变量名称不一定匹配。也就是说,id 始终称为“id”
  5. 我需要将结果重新分配给同一个对象(在上面的情况下,
    my_list
r list duplicates lapply
1个回答
0
投票

试试这个。

> Map(`[<-`, my_list, '.k', value=lapply(my_list, `[`, 'id') |> 
+       unlist() |> 
+       duplicated() |> 
+       split(sapply(my_list, nrow) |> {
+         \(.) mapply(rep.int, seq_along(.), .)
+       }())) |> 
+   lapply(subset, !.k, select=-.k)
[[1]]
     id country
1 xxxyz     USA
3 zzuio  Canada

[[2]]
     id country
2 ppuip  Canada
© www.soinside.com 2019 - 2024. All rights reserved.