2014-02-03 5 views
5

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

В приведенном ниже фрейме данных я хотел бы удалить все строки с одной записью (в этом случае B500 и D40).

x_1 <- c("A1", "A1","A1", "B10", "B10", "B10","B10", 
      "B500", "C100", "C100", "C100", "D40", "G100", "G100") 
    z_1 <- rnorm(14, 70) 
    z_2 <- rnorm(14, 1.7) 
    A <- data.frame(x_1, z_1, z_2) 

     x_1  z_1  z_2 
1  A1 69.65033 1.5308858 
2  A1 68.72687 2.2859416 
3  A1 68.32700 0.7994794 
4  B10 68.68382 0.5212132 
5  B10 70.23359 1.3266729 
6  B10 70.68604 4.3823605 
7  B10 70.52774 2.2430322 
8  B500 69.62868 3.0121398 
9  C100 69.41412 2.1895905 
10  C100 69.10745 1.7599065 
11  C100 69.70876 1.6001099 
12  D40 68.96542 0.7485665 
13  G100 70.21754 1.9635395 
14  G100 72.70583 3.0645247 

Я могу сделать это вручную с помощью:

A[!A$x_1 %in% c("B500", "D40"), ] 

Другой способ сделать это с помощью функции таблицы ниже:

table(A$x_1) 

    A1 B10 B500 C100 D40 G100 
    3 4 1 3 1 2 

Теперь моя проблема заключается в том, как я могу выбрать записи с одним номером 1 под ними? Если я смогу это сделать, я смогу получить имена, а затем удалить их из фрейма данных.

Любые полезные идеи/коды будут высоко оценены.

ответ

2

Продолжение на вашем пути table. Я назначаю вашу таблицу объекту. Затем names из требуемых записей таблицы извлекаются и используются для подмножества кадра данных.

tt <- table(A$x_1) 
A[!A$x_1 %in% names(tt[tt == 1]), ] 

# or 
A[A$x_1 %in% names(tt[tt > 1]), ] 

#  x_1  z_1  z_2 
# 1 A1 69.18667 0.8578626 
# 2 A1 71.36819 2.8482506 
# 3 A1 69.71246 1.9528315 
# 4 B10 69.47145 1.7852872 
# 5 B10 69.12699 0.7663739 
# 6 B10 70.93589 1.1431804 
# 7 B10 68.72273 0.6836297 
# 9 C100 70.31252 2.4651336 
# 10 C100 69.89168 1.9991948 
# 11 C100 70.25079 1.0823843 
# 13 G100 69.56992 2.0879085 
# 14 G100 68.29589 2.9 
+0

@ Хенрик, это здорово. Огромное спасибо. –

3

Вы можете использовать duplicated дважды:

A[duplicated(A$x_1) | duplicated(A$x_1, fromLast = TRUE), ] 

    x_1  z_1  z_2 
1 A1 70.32176 2.5074802 
2 A1 70.28238 1.8819723 
3 A1 67.93057 2.1899037 
4 B10 69.75905 1.8493991 
5 B10 70.25713 2.6948229 
6 B10 69.33121 0.2793853 
7 B10 70.82879 2.2831781 
9 C100 70.14587 1.0332913 
10 C100 69.51571 0.2590098 
11 C100 70.48928 1.8471024 
13 G100 72.11057 0.6914086 
14 G100 69.93814 2.4245214 

Для получения дополнительной информации о том, как это работает, см this answer.

+0

@ Sven Hohenstein, спасибо за ваш ответ. Я не совсем понимаю, как работает «дублированный», но я буду читать об этом. –

+0

@John Я добавил ссылку на ответ с более подробной информацией. –

+0

@ Sven Hohenstein, спасибо за ссылку, очень ценю. –

Смежные вопросы