Подмножество с уникальными случаями, основанное на нескольких столбцах
Я хотел бы подмножество DataFrame включать только строки, которые имеют уникальные комбинации из трех столбцов. Моя ситуация аналогична ситуации, представленной в этом, но я хотел бы сохранить и другие столбцы в своих данных. Вот мой пример:
> df
v1 v2 v3 v4 v5
1 7 1 A 100 98
2 7 2 A 98 97
3 8 1 C NA 80
4 8 1 C 78 75
5 8 1 C 50 62
6 9 3 C 75 75
Запрошенный вывод будет примерно таким, где я ищу уникальные случаи, основанные только на v1, v2 и v3:
> df.new
v1 v2 v3 v4 v5
1 7 1 A 100 98
2 7 2 A 98 97
3 8 1 C NA 80
6 9 3 C 75 75
Если бы я смог восстановить не уникальные строки, которые тоже были бы хороши:
> df.dupes
v1 v2 v3 v4 v5
3 8 1 C NA 80
4 8 1 C 78 75
5 8 1 C 50 62
Я видел связанный вопрос, как это сделать в sql (здесь), но я не могу получить это в R. Я уверен, что это просто, но беспорядок с уникальными() и подмножество() не был плодотворным. Спасибо заранее.
Ответы
Ответ 1
Вы можете использовать функцию duplicated()
для поиска уникальных комбинаций:
> df[!duplicated(df[1:3]),]
v1 v2 v3 v4 v5
1 7 1 A 100 98
2 7 2 A 98 97
3 8 1 C NA 80
6 9 3 C 75 75
Чтобы получить только дубликаты, вы можете проверить его в обоих направлениях:
> df[duplicated(df[1:3]) | duplicated(df[1:3], fromLast=TRUE),]
v1 v2 v3 v4 v5
3 8 1 C NA 80
4 8 1 C 78 75
5 8 1 C 50 62
Ответ 2
Вы можете использовать пакет plyr
:
library(plyr)
ddply(df, c("v1","v2","v3"), head, 1)
# v1 v2 v3 v4 v5
# 1 7 1 A 100 98
# 2 7 2 A 98 97
# 3 8 1 C NA 80
# 4 9 3 C 75 75
ddply(df, c("v1","v2","v3"), function(x) if(nrow(x)>1) x else NULL)
# v1 v2 v3 v4 v5
# 1 8 1 C NA 80
# 2 8 1 C 78 75
# 3 8 1 C 50 62
Ответ 3
да, но использование plyr и ddply очень медленное, если у вас слишком много данных.
вы попробуете что-то в этом роде:
df[ cbind( which(duplicated(df[1:3])), which(duplicated(df[1:3], fromLast=TRUE))),]
или::
from = which(duplicated(df[1:3])
to = which(duplicated(df[1:3], fromLast=TRUE))
df[cbind(from,to),]
shd будет быстрее по большей части.
проверить это и сообщить нам
есть некоторые ошибки, но я предполагаю, что вы можете исправить их до тех пор, пока вы получите эту идею.
также попробуйте уникальный и все, что
Ответ 4
Не элегантный, но функциональный способ заключается в том, чтобы вставлять записи данной строки вместе и находить уникальные (или не уникальные) строки, например:
df.vector=apply(df,1,FUN=function(x) {paste(x,collapse="")})
df.table=table(df.vector)
то получим индексы дубликатов с чем-то вроде:
which(df.vector%in%names(which(df.table>1)))