Удалить дубликаты строк в кадре данных по столбцу - PullRequest
1 голос
/ 25 апреля 2020

У меня есть фрейм данных:

df=data.frame(doc_id=c(1, 1, 2, 2), terms=c("virginia","bye","energy","energy"), freq=c(1,1,2,1))

т.е.

> df
  doc_id    terms freq
1      1 virginia    1
2      1      bye    1
3      2   energy    2
4      2   energy    1

Я хотел бы удалить дубликаты в столбцах doc_id и terms; например строки 3 и 4 имеют одинаковые поля doc_id и terms. Но дубликаты, которые я хотел бы сохранить, должны быть с максимальными значениями в поле freq.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Вот вариант с slice. После группировки по 'doc_id', 'term', slice строке со значением max 'freq'

library(dplyr)
df %>% 
    group_by(doc_id, terms) %>%
    slice(which.max(freq))
# A tibble: 3 x 3
# Groups:   doc_id, terms [3]
#  doc_id terms     freq
#   <dbl> <fct>    <dbl>
#1      1 bye          1
#2      1 virginia     1
#3      2 energy       2

или просто summarise, если имеется только три столбца

df %>% 
   group_by(doc_id, terms) %>%
   summarise(freq = max(freq))

Или с arrange и distinct

df %>%
   arrange(doc_id, terms, desc(freq)) %>%
   distinct(doc_id, terms, .keep_all = TRUE)

Или в base R, order наборе данных сначала, так что значение max 'freq' будет Первая строка для каждой группы, а затем используйте duplicated, чтобы удалить дублирующиеся строки

df1 <- df[with(df, order(doc_id, terms, -freq)),]
df1[!duplicated(df1[-3]),]
#  doc_id    terms freq
#2      1      bye    1
#1      1 virginia    1
#3      2   energy    2
1 голос
/ 25 апреля 2020

Другая базовая опция R: использование subset + ave

dfout <- subset(df,
                !!ave(freq,
                      doc_id,
                      terms,
                      FUN = function(x) seq_along(x)==which.max(x)))

, что дает

> dfout
  doc_id    terms freq
1      1 virginia    1
2      1      bye    1
3      2   energy    2

или более компактная версия с использованием aggregate (спасибо @akrun)

dfout <- aggregate(freq ~ ., df, FUN = max)

, что дает

> dfout
  doc_id    terms freq
1      1      bye    1
2      2   energy    2
3      1 virginia    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...