在基于数据帧的off id中分离唯一和重复的条目

时间:2014-07-14 17:52:26

标签: r duplicates

我有一个带有id变量的数据帧,可能会重复。我想把它分成两个数据帧,一个只包含id重复的条目,另一个只显示唯一的id。这样做的最佳方式是什么?

例如,假设我有数据框:

dataDF <- data.frame(id = c(1,1,2,3,4,4,5,6),
                      a = c(1,2,3,4,5,6,7,8),
                      b = c(8,7,6,5,4,3,2,1))

即。以下

  id a b
1  1 1 8
2  1 2 7
3  2 3 6
4  3 4 5
5  4 5 4
6  4 6 3
7  5 7 2
8  6 8 1

我想获得以下数据帧:

  id a b
1  1 1 8
2  1 2 7
5  4 5 4
6  4 6 3

  id a b
3  2 3 6
4  3 4 5
7  5 7 2
8  6 8 1

我目前正在执行以下操作

dupeIds  <- unique(subset(dataDF, duplicated(dataDF$id))$id)
uniqueDF <- subset(dataDF, !id %in% dupeIds)
dupeDF   <- subset(dataDF, id %in% dupeIds)

这似乎有效,但似乎有点偏离三次子集,是否有更简单的方法这样做?感谢

1 个答案:

答案 0 :(得分:3)

使用duplicated两次,一次自上而下,一次自下而上,然后使用splitlist中获取所有内容,如下所示:

split(dataDF, duplicated(dataDF$id) | duplicated(dataDF$id, fromLast = TRUE))
# $`FALSE`
#   id a b
# 3  2 3 6
# 4  3 4 5
# 7  5 7 2
# 8  6 8 1
# 
# $`TRUE`
#   id a b
# 1  1 1 8
# 2  1 2 7
# 5  4 5 4
# 6  4 6 3

如果您需要将其拆分为工作区中的单独data.frame(不确定为什么您需要这样做),请将names分配给列表项(例如names(mylist) <- c("nodupe", "dupe"))然后使用list2env