【问题标题】:Removing duplicates if there is NA in one of the duplicates in R如果在 R 中的重复项之一中存在 NA,则删除重复项
【发布时间】:2020-08-05 10:30:30
【问题描述】:

我正在尝试从数据集中删除重复项(由合并引起)。但是,一行包含一个值,而另一行不包含,在某些情况下,两行都是 NA。我想保留那些有数据的,如果有 NA,那么我保留哪个并不重要。我怎么做?我被卡住了。

我没有成功尝试过这里的解决方案(通常也不使用 data.table,所以我不明白是什么)

R data.table remove rows where one column is duplicated if another column is NA

一些最小示例数据:

df <- data.frame(ID = c("A", "A", "B", "B", "C", "D", "E", "G", "H", "J", "J"),
                 value = c(NA, 1L, NA, NA, 1L, 1L, 1L, 1L, 1L, NA, 1L))

ID value
A    NA
A     1
B    NA
B    NA
C     1
D     1
E     1
G     1
H     1
J    NA
J     1

我想要这个:

ID value
A     1
B    NA
C     1
D     1
E     1
G     1
H     1
J     1

【问题讨论】:

  • 链接问题中@Psidom的答案也可以,您只需要适应整数:library(data.table) setDT(df)[, .(value = if (all(is.na(value))) NA_integer_ else na.omit(value)), by = ID]

标签: r duplicates


【解决方案1】:

使用dplyr 的一种可能性是:

df %>%
 group_by(ID) %>%
 slice(which.max(!is.na(value)))

  ID    value
  <chr> <int>
1 A         1
2 B        NA
3 C         1
4 D         1
5 E         1
6 G         1
7 H         1
8 J         1

【讨论】:

  • 这比@Darren Tsais 解决方案稍快。谢谢!
【解决方案2】:

@tmfmnk 在dplyr 中使用slice_max() 的替代答案。

library(dplyr)

df %>%
  group_by(ID) %>%
  slice_max(!is.na(value), with_ties = F)

# # A tibble: 8 x 2
# # Groups:   ID [8]
#   ID    value
#   <chr> <int>
# 1 A         1
# 2 B        NA
# 3 C         1
# 4 D         1
# 5 E         1
# 6 G         1
# 7 H         1
# 8 J         1

【讨论】:

    【解决方案3】:

    这里有一个比较简单的data.table解决方案。

    如果所有值都是NA,则按ID分组,只取第一个value,如果不取所有不是NA的值。

    library(data.table)
    setDT(df)
    df[, if (all(is.na(value))) value[1] else value[!is.na(value)], by = ID]
    

    【讨论】:

    • 感谢您的解释!有时知道如何正确阅读代码会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2022-08-14
    相关资源
    最近更新 更多