我有一个带有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)
这似乎有效,但似乎有点偏离三次子集,是否有更简单的方法这样做?感谢
答案 0 :(得分:3)
使用duplicated
两次,一次自上而下,一次自下而上,然后使用split
在list
中获取所有内容,如下所示:
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
。