Выявление повторяющихся столбцов в кадре данных - PullRequest
16 голосов
/ 22 марта 2012

Я новичок в R и пытаюсь удалить дублирующиеся столбцы из большого кадра данных (50К строк, 215 столбцов).Кадр имеет смесь дискретных непрерывных и категориальных переменных.

Мой подход состоял в том, чтобы сгенерировать таблицу для каждого столбца в кадре в список, а затем использовать функцию duplicated(), чтобы найти строки в списке, которыеявляются дубликатами, как показано ниже:

age=18:29
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)
gender=c("M","F","M","M","F","F","M","M","F","M","F","M")
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender)

tables=apply(testframe,2,table)
dups=which(duplicated(tables))
testframe <- subset(testframe, select = -c(dups))

Это не очень эффективно, особенно для больших непрерывных переменных.Однако я пошел по этому пути, потому что не смог получить тот же результат, используя сводку (обратите внимание, что в следующем примере предполагается, что оригинал testframe содержит дубликаты):

summaries=apply(testframe,2,summary)
dups=which(duplicated(summaries))
testframe <- subset(testframe, select = -c(dups))

Если вы запустите этокод, который вы увидите, удаляет только первый найденный дубликат.Я предполагаю, что это потому, что я делаю что-то не так.Кто-нибудь может указать, где я ошибаюсь, или, что еще лучше, указать мне, как лучше удалить дублирующиеся столбцы из кадра данных?

Ответы [ 6 ]

19 голосов
/ 22 марта 2012

Вы можете сделать с lapply:

testframe[!duplicated(lapply(testframe, summary))]

summary суммирует распределение при игнорировании заказа.

Не 100%, но я бы использовал дайджест, если данные огромны:

library(digest)
testframe[!duplicated(lapply(testframe, digest))]
18 голосов
/ 05 ноября 2015

Как насчет:

testframe[!duplicated(as.list(testframe))]
4 голосов
/ 09 марта 2016

Хорошая уловка, которую вы можете использовать, - это транспонировать фрейм данных, а затем проверять наличие дубликатов.

duplicated(t(testframe))
3 голосов
/ 22 марта 2012
unique(testframe, MARGIN=2) 

не работает, хотя я думаю, что должно, поэтому попробуйте

as.data.frame(unique(as.matrix(testframe), MARGIN=2))

или, если вас волнует, что числа превращаются в факторы,

testframe[,colnames(unique(as.matrix(testframe), MARGIN=2))]

, который производит

   age height gender
1   18   76.1      M
2   19   77.0      F
3   20   78.1      M
4   21   78.2      M
5   22   78.8      F
6   23   79.7      F
7   24   79.9      M
8   25   81.1      M
9   26   81.2      F
10  27   81.8      M
11  28   82.8      F
12  29   83.5      M
0 голосов
/ 09 марта 2018

Вот простая команда, которая будет работать, если дублированные столбцы вашего фрейма данных будут иметь одинаковые имена:

testframe[names(testframe)[!duplicated(names(testframe))]]
0 голосов
/ 04 января 2017

На самом деле вам просто нужно инвертировать дублированный результат в вашем коде, и вы можете использовать subset (что более читабельно по сравнению с скобками в imho)

require(dplyr)
iris %>% subset(., select=which(!duplicated(names(.)))) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...