【问题标题】:rbind and overwrite duplicate rows based on key variable?rbind 并根据键变量覆盖重复的行?
【发布时间】:2014-05-05 16:20:11
【问题描述】:
> part1<-data.frame(key=c(5,6,7,8,9),x=c("b","d","a","c","b"))
> part1
  key x
1   5 b # key==5,x==b
2   6 d
3   7 a
4   8 c
5   9 b
> part2<-data.frame(key=c(1,2,3,4,5), x=c("c","a","b","d","a"))
> part2
  key x
1   1 c
2   2 a
3   3 b
4   4 d
5   5 a # key==5,x==a

有超过 2 个数据帧,但我将在此示例中仅使用 2 个。然后我使用 lapply 将它们全部放在一个名为 dflist1 的列表中,然后对它们进行 rbind。对于这个示例,我将手动完成。

dflist1<-list(part1,part2)
final<-do.call(rbind,dflist1)
final<-final[order(final$key),] #sort by key

结果:

> final
   key x
6    1 c
7    2 a
8    3 b
9    4 d
1    5 b #duplicate from part1
10   5 a #duplicate from part2
2    6 d
3    7 a
4    8 c
5    9 b

我想摆脱重复。它很容易使用 !duplicated() 但在这种情况下,我特别想删除/覆盖早期数据帧中的行 - 即,在这种情况下,第 1 部分中的“5 b”应该被第 2 部分中的“5 a”删除/覆盖.如果有一个值为“5 b”的 part3,那么来自 part2 的“5 a”将被来自 part3 的“5 b”删除/覆盖。

我想要什么:

   key x
6    1 c
7    2 a
8    3 b
9    4 d
10   5 a #this is from part2, no more duplicate from part1
2    6 d
3    7 a
4    8 c
5    9 b

当前解决方案:我唯一能想到的就是添加一个函数,用一个额外的变量标记每个数据帧,然后对其进行排序并在该变量上使用 !duplicated ... 有没有更简单或更优雅的解决方案不需要标记?

【问题讨论】:

  • 提示:使用data.table(), setkey(), unique()
  • 另外,请注意,R 的排序函数是 stable sorting algorithm 并保留卫星数据,因此您可以反转、使用 !duplicated 并再次反转。
  • 也许,duplicated 的“fromLast = T”参数可能有用?例如。 final[!duplicated(final$key, fromLast = T), ] 看起来像你的输出

标签: r duplicates rbind


【解决方案1】:
## Create many data.frames

set.seed(1)

## Normally, do this in lapply... 
part1 <- data.frame(key=1:6,  x=sample(letters, 6))
part2 <- data.frame(key=4:8,  x=sample(letters, 5))
part3 <- data.frame(key=8:12, x=sample(letters, 5))

library(data.table)

## Collect all your "parts"
PARTS.LIST <- lapply(ls(pattern="^part\\d+"), function(x) get(x))


DT.part <- rbindlist(PARTS.LIST)

setkey(DT.part, key)
unique(DT.part, by="key")

ORIGINAL          UNIQUE
---------         -----------
> DT.part         > unique(DT.part, by="key")
    key x             key x
 1:   1 l          1:   1 l
 2:   2 v          2:   2 v
 3:   3 k          3:   3 k
 4:   4 q          4:   4 q
 5:   4 i          5:   5 r
 6:   5 r          6:   6 f
 7:   5 w          7:   7 v
 8:   6 f          8:   8 f
 9:   6 o          9:   9 j
10:   7 v         10:  10 d
11:   8 f         11:  11 g
12:   8 l         12:  12 m
13:   9 j
14:  10 d
15:  11 g
16:  12 m

【讨论】:

  • 很抱歉疏通了这个问题,但原发帖人没有接受这个答案或跟进它。我和他们处于同样的情况(除了我使用多个键),这个答案只是有点不起作用。我希望能够保留后者的关键条目,而不是第一个。除了保留第一个键(5,r)而不是预期的键(5,w)之外,这非常有效。键的顺序是否取决于您绑定不同数据帧的顺序?
  • 嗨@kyles。您可以发布一个新问题并简单地链接到此问题。 (这里用我的手机写)
猜你喜欢
  • 2016-04-18
  • 2023-01-19
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 2022-07-10
相关资源
最近更新 更多