【问题标题】:R remove duplicate rows keeping those with valuesR删除重复的行,保留那些带有值的行
【发布时间】:2019-05-24 00:42:31
【问题描述】:

我有一个包含四列的大型数据集:问题、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)`

【问题讨论】:

  • 要么 (a) 对数据进行排序(大多数排序会将 NA 放在最后,因此它们将省略重复项)或 (b) 仅省略 NA,na.omit(df1)
  • 删除response 中的NA 行? df1[!is.na(df1$response), ]

标签: r


【解决方案1】:

我们可以执行arrange 以确保NA 元素排在最后,然后获取distinct,以便distinct 根据指定的列获取第一个非重复行

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

如果我们需要保留 NA 的 'id' 而不使用其中的 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))

可以,但在实际数据集中可能不起作用

【讨论】:

  • dplyr 版本完美运行,谢谢!第二种解决方案在我的实际数据集中不起作用。
  • 我刚刚看到我遇到的一个问题是我有一些没有 id 的行(它们是空白的),并且这些行也使用 dplyr 方法删除,因为distinct() 将它们视为重复项。理想情况下,我希望将它们包含在我的数据集中。有没有办法在你上面的方法中解决这个问题?
  • @user9660581 你是说NA 中的id
  • @user9660581 试用更新版本df1 %&gt;% arrange(id, country, is.na(response)) %&gt;% group_by(id, country) %&gt;% filter(row_number() == 1 | is.na(id))
【解决方案2】:

基本的 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

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 2019-08-12
    • 2019-10-27
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多