R删除重复的行,使它们保留值

时间:2019-05-23 15:16:11

标签: r

我有一个包含四列的大型数据集:问题,ID,国家/地区和响应。在id栏中,我有几个重复项。这是因为它们指的是同一个问题,但是在重复项中一个具有值而另一个为NA的意义上,答案是不同的。现在,我想删除重复项,并保留那些响应列中有值的行。请注意,我数据库中的值为数字或字符。

我尝试使用dplyr软件包中的distinct()。但是,问题在于,无论响应列中的内容是什么,它总是删除第一行/第一个重复项。

这是我的代码:

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

我期望的输出是我留下唯一的ID行(没有重复项),并且在响应列中没有信息丢失。请参见下面的示例:

    #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 个答案:

答案 0 :(得分:4)

我们可以执行arrange来确保NA元素排在最后,然后取distinct以便distinct取基于以下内容的第一个非重复行指定的列

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

如果我们需要保留NA的'id's而不必取其中的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 :(得分:1)

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