Удалить дубликаты на основе условий в строках в кадре данных

avatar
ML_Enthousiast
8 августа 2021 в 19:46
204
3
2

У меня есть кадр данных, содержащий много повторяющихся имен, ниже приведен воспроизводимый пример.
Я пытаюсь очистить набор данных, удалив строки с повторяющимися именами и самой низкой информацией.
Я добавил столбец, в котором я вычисляю % от NA ячеек в каждой строке, в моем примере я назвал его %_Scoring<335430613>135430613 .

Among the duplicate name rows I want to keep the row that have the lowest %_Scoring (% of NA)
N:B Если %_Scoring равно, это не имеет значения, одна из двух строк все равно должна быть удалена.

data_people <- "https://raw.githubusercontent.com/max9nc9/Temp/main/data_people.csv"
data_people <- read.csv(data_people, sep = ",")

В приведенном выше примере данных я бы оставил только 2 строки:

  • Первый ряд — Маргарита Пэн
  • Вторая строка — Джон Доу, где %_Scoring = 0,56
Источник
ML_Enthousiast
9 августа 2021 в 06:57
1

хорошо, я отредактировал свой пост, спасибо!

Ответы (3)

avatar
akrun
8 августа 2021 в 19:49
3

Используйте slice_max после группировки по имени

library(dplyr)
data_people %>% 
    group_by(Name) %>%
    slice_max(n = 1, order_by = X._Scoring) %>%
    ungroup

-выход

# A tibble: 2 x 4
  Name          Information                    Height X._Scoring
  <chr>         <chr>                           <dbl>      <dbl>
1 John Doe      This is an information           1.88       0.89
2 Margarita Pan This is an information as well   1.47       0.78

Или, если мы хотим оставить минимальное значение, то используем slice_min

data_people %>% 
    group_by(Name) %>%
    slice_min(n = 1, order_by = X._Scoring) %>%
    ungroup
# A tibble: 2 x 4
  Name          Information                    Height X._Scoring
  <chr>         <chr>                           <dbl>      <dbl>
1 John Doe      This is an information          NA          0.56
2 Margarita Pan This is an information as well   1.47       0.78
avatar
ThomasIsCoding
8 августа 2021 в 20:39
2

Базовый вариант R с duplicated + ave

subset(
  data_people,
  !duplicated(Name) & ave(rowSums(!is.na(data_people)), Name, FUN = function(x) x == max(x))
)

дает

           Name                    Information Height X._Scoring
1      John Doe         This is an information   1.88       0.89
2 Margarita Pan This is an information as well   1.47       0.78
avatar
TarJae
8 августа 2021 в 20:25
3
library(dplyr)
data_people %>% 
    group_by(Name) %>% 
    arrange(X._Scoring) %>% 
    filter(!duplicated(Name) & min(X._Scoring))

Вывод

  Name          Information                    Height X._Scoring
  <chr>         <chr>                           <dbl>      <dbl>
1 John Doe      This is an information          NA          0.56
2 Margarita Pan This is an information as well   1.47       0.78