Подтвердить что ты не робот

Подмножество с уникальными случаями, основанное на нескольких столбцах

Я хотел бы подмножество 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. Я уверен, что это просто, но беспорядок с уникальными() и подмножество() не был плодотворным. Спасибо заранее.

4b9b3361

Ответ 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)))