R удалить повторяющиеся строки, сохраняя их со значениями - PullRequest
0 голосов
/ 23 мая 2019

У меня большой набор данных с четырьмя столбцами: вопрос, идентификатор, страна и ответ.В столбце id у меня есть несколько дубликатов.Это потому, что они относятся к одному и тому же вопросу, но ответы отличаются в том смысле, что один из дубликатов имеет значение, а другой - NA.Теперь я хотел бы удалить дубликаты и сохранить те строки, в которых столбец ответа имеет значение.Обратите внимание, что значения в моей базе данных являются числовыми или символьными.

Я пытался использовать distinct() из пакета dplyr.Однако проблема в том, что он всегда удаляет первую строку / первый дубликат независимо от того, что стоит в столбце ответа.

Вот мой код:

df1 %>% distinct(id, country, .keep_all = TRUE)

Я ожидаю, что у меня останутся строки с уникальным идентификатором (дубликатов не осталось) и что в столбце ответа информация не будет потеряна.Смотрите пример ниже:

    #Initial data frame
    df1  <- read.table(text="question id  country response
                              X1    10  Belgium    40
                              X2    12  Austria    NA
                              X2_1  12  Austria    NEW
                              X4    17  USA        NA
                              X5    17  USA        5
                              X6    NA  Italy      61
                              X7    15  Spain      
                              X8    15  Spain      100", header=TRUE, stringsAsFactors=FALSE)`


    #Expected Output
    df1  <- read.table(text="question id  country response
                              X1    10  Belgium    40
                              X2_1  12  Austria    NEW
                              X5    17  USA        5
                              X6    NA  Italy      61
                              X8    15  Spain      100", header=TRUE, stringsAsFactors=FALSE)`

Ответы [ 2 ]

4 голосов
/ 23 мая 2019

Мы можем сделать arrange, чтобы убедиться, что элементы NA расположены последними, а затем взять distinct, чтобы distinct занял первые недублированные строки на основе указанных столбцов

library(dplyr)
df1 %>%
   arrange(id, country, is.na(response)) %>% 
   distinct(id, country, .keep_all = TRUE)

Если нам нужно сохранить идентификаторы NA без учета distinct этих

df1 %>% 
   arrange(id, country, is.na(response)) %>% 
   group_by(id, country) %>%
   filter(row_number() == 1 | is.na(id))

Для этого примера даже

df1[complete.cases(df1$response),]

В tidyverse синтаксис

df1 %>% 
    filter(complete.cases(response))

будет работать, но может не работать в реальном наборе данных

1 голос
/ 23 мая 2019

Базовым решением R может быть следующее.

i <- !(duplicated(df1$id) & duplicated(df1$id, fromLast = TRUE))
j <- !is.na(df1$response)
df1[i & j, ]  
#  question id country response
#1       X1 10 Belgium       40
#3     X2_1 12 Austria      NEW
#5       X5 17     USA        5
#6       X6 NA   Italy       61
#8       X8 15   Spain      100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...