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