R 如何基于某些列删除重复行(较短的行)?

R 如何基于某些列删除重复行(较短的行)?,r,dataframe,duplicates,R,Dataframe,Duplicates,假设我有以下df df <- data.frame(col1 = c(1, 3, 1), col2 = c(2, 4, 2), col3 = c(NA, NA, "c")) > df col1 col2 col3 1 1 2 <NA> 2 3 4 <NA> 3 1 2 c 但这只给了我第三排(而不是第三排和第二排)。如何做好这件事 编辑:真实的df有15列,其中前13列用于识别重复项。在最后两列中,大约有2/3的

假设我有以下
df

df <- data.frame(col1 = c(1, 3, 1), col2 = c(2, 4, 2), col3 = c(NA, NA, "c"))
> df
  col1 col2 col3
1    1    2 <NA>
2    3    4 <NA>
3    1    2    c
但这只给了我第三排(而不是第三排和第二排)。如何做好这件事

编辑:真实的
df
有15列,其中前13列用于识别重复项。在最后两列中,大约有2/3的行填充了NAs(前13列不包含任何NAs)。因此,我的示例
df
具有误导性,因为要识别重复项,需要排除两列。对此我很抱歉。

您可以尝试以下方法:

library(dplyr)
df %>% group_by(col1,col2) %>%
  slice(which.min(is.na(col3)))
或者这个:

df %>%
  group_by(col1,col2) %>%
  arrange(col3) %>%
  slice(1)

# # A tibble: 2 x 3
# # Groups:   col1, col2 [2]
#    col1  col2   col3
#   <dbl> <dbl> <fctr>
# 1     1     2      c
# 2     3     4     NA

df您可以在删除复制之前将NAs排序到顶部或底部:

# in base, which puts NAs last
odf = df[do.call(order, df), ]
odf[!duplicated(odf[, c("col1", "col2")]), ]

#   col1 col2 col3
# 3    1    2    c
# 2    3    4 <NA>

# or with data.table, which puts NAs first
library(data.table)
DF = setorder(data.table(df))
unique(DF, by=c("col1", "col2"), fromLast=TRUE)

#    col1 col2 col3
# 1:    1    2    c
# 2:    3    4   NA
#在base中,将NAs放在最后
odf=df[do.call(order,df),]
odf[!重复(odf[,c(“col1”,“col2”)),]
#col1 col2 col3
#3 1 2 c
# 2    3    4 
#或者使用data.table,将NAs放在第一位
库(数据表)
DF=设置顺序(数据表(DF))
唯一(DF,by=c(“col1”,“col2”),fromLast=TRUE)
#col1 col2 col3
#1:12 c
#2:34 NA

dplyr不能采用这种方法,它在
arrange
中不提供“按所有列排序”,在
distinct
中也不提供
fromLast

@Moody\u Mudskipper该数据帧不会失败?你是对的,对不起,我执行错误。那我就不明白下沃特西·弗兰克对我的回答的评论了,我们不是将军,我们有一个平衡的投票权。我的猜测是,投反对票的人不喜欢你使用
subset
而不是
df[!duplicates,]
或者更简单地说
df[!duplicated(df[,1:2]),]
@user108363对不起,投反对票(现在被锁定了:/)@弗兰克,这实际上是因为这样会删除所有后续重复行,这些行具有不同的非NA
col3
。试试这个:
df如果有两行具有相同的
col1
col2
并且都具有非NA
col3
,该怎么办?你应该两个都留着吗?删除第一个?我应该提到这种情况不存在。小点:如果“最长行”OP的意思是“我把一个向量分布在许多列的右边,所有列看起来都像col3”,那么这个答案将选择错误的东西
df=data.frame(col1=1,col2=1,col3=c(NA,“a”,“a”),col4=c(NA,NA,“b”)
。然而,如果OP真的这样做了,他们的数据格式就不好了。嗯,不一定。这个问题有多种解释,OP或许应该加以澄清。看起来他们已经走神了,所以不用急于解决。根据我的新解释,df@Moody失败了是的,这是一种可能的解释。我猜col1,col2是从未丢失的分组变量;而col3+是长度可变的向量,每一行被分流到一行中(因此我们看到任何非最大长度向量都缺少)。不过完全是猜测。@MM,你的
df
是由Frank的
odf
处理的,这正是我想要的方式。再次为这个问题含糊不清的解释感到抱歉。这是一个值得思考的有趣问题:)
df %>% mutate(nna = df %>% is.na  %>% rowSums) %>%
  group_by(col1) %>%         # or group_by(col1,col2)
  slice(which.min(nna)) %>%
  select(-nna)
df <- data.frame(col1 = c(1, 3, 1), col2 = c(2, 4, 2), col3 = c(NA, NA, "c"))
df <- df[order(df$col3),] 

duplicates <- duplicated(df[,1:2])
duplicates_sub <- subset(df , duplicates == FALSE)  

> duplicates_sub
  col1 col2 col3
3    1    2    c
2    3    4 <NA>
df <- data.frame(col1 = c(1, 3, 1,3, 1), col2 = c(2, 4, 2,4, 2), col3 = c("a", NA, "c",NA, "b"))
df <- df[order(df$col3),] 
duplicates <- duplicated(df[,1:2]) & is.na(df[,3])
duplicates_sub <- subset(df , duplicates == FALSE)  

> duplicates_sub
  col1 col2 col3
1    1    2    a
5    1    2    b
3    1    2    c
2    3    4 <NA>
# in base, which puts NAs last
odf = df[do.call(order, df), ]
odf[!duplicated(odf[, c("col1", "col2")]), ]

#   col1 col2 col3
# 3    1    2    c
# 2    3    4 <NA>

# or with data.table, which puts NAs first
library(data.table)
DF = setorder(data.table(df))
unique(DF, by=c("col1", "col2"), fromLast=TRUE)

#    col1 col2 col3
# 1:    1    2    c
# 2:    3    4   NA