Удаление дубликатов в R на основе условия - PullRequest
0 голосов
/ 31 декабря 2018

Мне нужно встроить условие в функцию удаления дубликатов.Я работаю с большой студенческой базой данных из Южной Африки, многоязычной страны.На прошлой неделе вы, ребята, дали мне код для удаления дубликатов, вызванных повторными попытками, но теперь я понимаю, что данные моих языковых экзаменов показывают, что некоторые студенты предлагают более двух разных языков.Исходные данные в упрощенном виде выглядят так:

STUDID   MATSUBJ     SCORE
101      AFRIKAANSB   1
101      AFRIKAANSB   4
102      ENGLISHB     2
102      ISIZULUB     7
102      ENGLISHB     5

Мне нужен файл результата:

STUDID   MATSUBJ    SCORE  flagextra
101      AFRIKAANS   4
102      ENGLISH     5
102      ISIZULUB    7     1

Мне нужно пометить дополнительный язык, чтобы я мог видеть, какие они языки, и делатьНовая категория для этого

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Для меня, как новичка в R, лучше работать с двухэтапной процедурой:

удалить дубликаты, вызванные повторениями предметов df <-LANGSEC%>% group_by (STUDID, MATRICSUBJ)%>% top_n (1, SUBJSCORE) # Затем пометьте один из двух предметов, вызывая оставшиеся дубликаты LANGSEC $ flagextra <-as.integer (дублированный (LANGSEC $ STUDID), LANGSEC $ MATRICSUBJ # Затем выполните фильтрацию для этого третьего языка и создайте новый файл LANG3 <-LANGSEC%>%фильтр (flagextra == 1) # Затем удалите их из другого файла LANG2 <-LANGSEC%>% filter (! flagextra == 1)

0 голосов
/ 31 декабря 2018

Может быть, это поможет

library(tidyverse)
df1 %>% 
   group_by(STUDID, MATSUBJ) %>% 
   summarise(SCORE = max(SCORE), 
             flagextra = as.integer(!sum(duplicated(MATSUBJ))))
# A tibble: 3 x 4
# Groups:   STUDID [?]
#  STUDID MATSUBJ    SCORE flagextra
#   <int> <chr>      <dbl>     <int>
#1    101 AFRIKAANSB     4         0
#2    102 ENGLISHB       5         0
#3    102 ISIZULUB       7         1

Или с base R

i1 <- !(duplicated(df1[1:2])|duplicated(df1[1:2], fromLast = TRUE))
transform(aggregate(SCORE ~ ., df1, max), 
          flagextra = as.integer(MATSUBJ %in% df1$MATSUBJ[i1]))

данными

df1 <- structure(list(STUDID = c(101L, 101L, 102L, 102L, 102L), MATSUBJ 
      = c("AFRIKAANSB", 
 "AFRIKAANSB", "ENGLISHB", "ISIZULUB", "ENGLISHB"), SCORE = c(1L, 
 4L, 2L, 7L, 5L)), class = "data.frame", row.names = c(NA, -5L
 ))
...