我有一个如下所示的数据框。我想找到唯一的行(唯一性)。但是在这个数据中我有'NA'。我喜欢如果一行中具有 NA 值的所有值都与其他行相同(如行:1,2,5)我想忽略它,但如果不相同(如行:2,4)我想保留它作为独特的行。 例如,在第 1、2 和 6 行中,除 NA 之外的所有值都相同,因为 NA 可以是值“1 和 3”,所以我想删除这一行并只保留第 2 行。 此外,在第 6 行中,值 2 和 3(不包括 NA)与行 c2 和 c5 相同,并且 c6 中的 NA 可能获得与 c2 和 c5 相同的值,因此该行不是唯一的。
此外,@Sotos 解决方案对我有更多帮助,但在为行创建模式时删除 NA 后的最后一部分,他的解决方案考虑了 c8 和 c6 的相同模式 (23) 并将它们删除。但实际上 c8 是独一无二的。
数据:
a1 a2 a3 a4
c1 2 1 3 NA
c2 2 1 3 3
c3 2 1 4 3
c4 2 2 3 NA
c5 2 1 3 3
c6 2 NA 3 NA
c7 2 NA 0 NA
c8 2 3 NA NA
我想要这样的输出:
输出:
a1 a2 a3 a4
c2 2 1 3 3
c3 2 1 4 3
c4 2 2 3 NA
c7 2 NA 0 NA
c8 2 3 NA NA
最佳答案
library(stringr)
df <- unique(df)
#paste rows omitting NAs
df$new <- apply(df, 1, function(i) paste(na.omit(i), collapse = ''))
#use str_detect to determine whether each pattern is found more than once
df$new2 <- rowSums(sapply(df$new, function(i) str_detect(i, df$new)))
new_df <- subset(df, df$new2 == 1)
new_df <- new_df[, !names(new_df) %in% c('new', 'new2')]
new_df
# V2 V3 V4 V5
#2 2 1 3 3
#3 2 1 4 3
#4 2 2 3 NA
根据您的评论使用附加行测试代码:
new_df
# a1 a2 a3 a4
#c2 2 1 3 3
#c3 2 1 4 3
#c4 2 2 3 NA
#c7 2 NA 0 NA
数据
dput(df)
structure(list(a1 = c(2L, 2L, 2L, 2L, 2L, 2L, 2L), a2 = c(1L,
1L, 1L, 2L, 1L, NA, NA), a3 = c(3L, 3L, 4L, 3L, 3L, 3L, 0L),
a4 = c(NA, 3L, 3L, NA, 3L, NA, NA)), .Names = c("a1", "a2",
"a3", "a4"), class = "data.frame", row.names = c("c1", "c2",
"c3", "c4", "c5", "c6", "c7"))
关于r - 在具有行 NA 的数据框中找到唯一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327084/