используя R - удалить строки, когда значение повторяется менее 3 раз - PullRequest
7 голосов
/ 13 октября 2010

кадр с 10 строками и 3 столбцами

    a   b c
1   1 201 1
2   2 202 1
3   3 203 1
4   4 204 1
5   5 205 4
6   6 206 5
7   7 207 4
8   8 208 4
9   9 209 8
10 10 210 5

Я хочу удалить все строки, в которых одно и то же значение в столбце "c" повторяется менее 3 раз.В этом примере я хочу удалить строки 6, 9 и 10. (мой реальный data.frame имеет 5000 строк и 25 столбцов). Я пытался сделать это, используя функцию rle, но продолжаю получать неправильное решение.любая помощь?спасибо!

Ответы [ 4 ]

14 голосов
/ 13 октября 2010

Опираясь на Ответ Иисуса Навина :

Data[Data$c %in% names(which(table(Data$c) > 2)), ]
4 голосов
/ 13 октября 2010

Поправьте меня, если я ошибаюсь, но, похоже, вы хотите, чтобы все строки имели значение в столбце c более чем в два раза. «Repeated» заставляет меня думать, что они должны происходить последовательно, для этого и нужен rle, но вы бы хотели строки 1-4, только если вы пытались это сделать.

Тем не менее, приведенный ниже код находит строки, в которых значение в столбце c встречается более 2 раз. Я уверен, что это можно сделать более элегантно, но это работает.

lines <-
"a   b c
1 201 1
2 202 1
3 203 1
4 204 1
5 205 4
6 206 5
7 207 4
8 208 4
9 209 8
10 210 5"
Data <- read.table(con <- textConnection(lines), header=TRUE); close(con)
cVals <- data.frame(table(Data$c))
Rows <- Data$c %in% cVals[cVals$Freq > 2,1]
Data[Rows,]
#  a   b c
#1 1 201 1
#2 2 202 1
#3 3 203 1
#4 4 204 1
#5 5 205 4
#7 7 207 4
#8 8 208 4
2 голосов
/ 13 октября 2010

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

Data[unsplit(table(Data$c), Data$c) >= 3, ]
1 голос
/ 01 февраля 2013

Вот решение, использующее ave:

Data[ave(Data$c, Data$c, FUN = length) > 2, ]

или используя ave с subset:

subset(Data, ave(c, c, FUN = length) > 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...