数据帧列表:

my_list <- list(structure(list("_uuid" = c("xxxyz", 
                                      "xxxyz", "zzuio", "iiopz"), country = c("USA", 
                                                                              "USA", "Canada", "Switzerland")), class = "data.frame", row.names = c(NA, -4L)), 
                structure(list("_uuid" = c("xxxyz", "ppuip", 
                                      "zzuio"), country = c("USA", "Canada", "Canada")), class = "data.frame", row.names = c(NA, 
                                                                                                                             -3L)))
my_list
[[1]]
  _uuid     country
1 xxxyz         USA
2 xxxyz         USA
3 zzuio      Canada
4 iiopz Switzerland

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

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

This用于删除每个数据帧中的重复项:

my_list <- lapply(my_list, function(z) z[!duplicated(z[["_uuid"]]),])
my_list
[[1]]
  _uuid     country
1 xxxyz         USA
3 zzuio      Canada
4 iiopz Switzerland

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

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

[[1]]
 _uuid   country
 iiopz   Switzerland

 [[2]]
 _uuid   country
 xxxyz   USA
 zzuio   Canada
 ppuip   Canada
 

注:

  1. 我想消除_uuid上的重复项(其他变量可以重复)
  2. 我需要一个解决方案,它是不需要合并数据帧判断重复
  3. 如果可能的话,我希望保留最后一点意见.例如,在上面的期望输出中,"zzuio Canada"在两个df中都存在,但只保留在最后的df中,即df 2中.
  4. 我有超过100个dfs,其中的变量名在dfs之间并不一定匹配.也就是说,id总是被称为"_uuid"
  5. 我需要将结果重新分配给同一个对象(在上面的例子中,my_list)

推荐答案

这里有一个镜头,开始是一个缩小,然后Map—应用到原始的帧列表.

previous_ids <- rev(Reduce(
  function(prev, this) unique(c(prev, this$id)),
  rev(my_list), init = character(0), accumulate = TRUE))[-1]
previous_ids
# [[1]]
# [1] "xxxyz" "ppuip" "zzuio"
# [[2]]
# character(0)

这给了我们my_list帧中的id,我们需要删除"这里".我们将其解释为,对于最后一帧,我们没有需要从其他帧中移除的ID;在第一帧中,我们有3个ID,稍后会在列表中看到,因此需要从"这个"(第一个)帧中移除它们.(注:previous_ids这个名字可能是一个误称...)

有了这个,我们可以简单地做:

Map(my_list, previous_ids,
    f = function(dat, rmid) {
      dat[!duplicated(dat$id, fromLast = TRUE) & !dat$id %in% rmid,]
    })
# [[1]]
# [1] id      country
# <0 rows> (or 0-length row.names)
# [[2]]
#      id country
# 1 xxxyz     USA
# 2 ppuip  Canada
# 3 zzuio  Canada

使用更新的数据,这仍然有效.唯一的问题是,因为你的ID字段是非标准的(从_开始,R不喜欢这样),我们需要使用反勾dat$`_uuid`或使用[[ dat[["_uuid"]].


previous_ids <- rev(Reduce(
  function(prev, this) unique(c(prev, this[["_uuid"]])),
  rev(my_list), init = character(0), accumulate = TRUE))[-1]
previous_ids

Map(my_list, previous_ids,
    f = function(dat, rmid) {
      dat[!duplicated(dat[["_uuid"]], fromLast = TRUE) & !dat[["_uuid"]] %in% rmid,]
    })
# [[1]]
#   _uuid     country
# 4 iiopz Switzerland
# [[2]]
#   _uuid country
# 1 xxxyz     USA
# 2 ppuip  Canada
# 3 zzuio  Canada

R相关问答推荐

geom_raster不适用于x比例中超过2,15的值

使用R的序列覆盖

R Markdown中的交叉引用表

编辑文件后编辑RhandsonTable

从开始时间和结束时间导出时间

更改编号列表的 colored颜色

如何按排序顺序打印一个框架中所有精确的唯一值?

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

根据多个条件增加y轴高度以适应geom_text标签

如何得到R中唯一的组合群?

为什么舍入POSIXct会更改能力以匹配等效的POSIXct?

R—将各种CSV数字列转换为日期

在嵌套列表中查找元素路径的最佳方法

按组和连续id计算日期差

R-找出存在其他变量的各种大小的所有组合

如何在R中创建这些列?

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

带有Bootswatch Cerulean主题的shiny 仪表板中的浏览&按钮可见性问题

从字符串列中的向量中查找第一个匹配的单词

如何在GGPlot中控制多个图例和线型