【问题标题】:Find uniqueness in data frame withe rows NA?在行 NA 的数据框中找到唯一性?
【发布时间】:2016-07-19 12:48:56
【问题描述】:

我有一个如下所示的数据框。我想找到唯一的行(唯一性)。但是在这个数据中我有'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 解决方案对我的帮助更大,但在最后一部分中,在为 rows 制作模式时删除 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

【问题讨论】:

  • 所以在检查 dups 时 NA 是通配符?
  • 你可以使用hclust来直观的看到相似度:plot(hclust(dist(your_data_frame)))
  • Mehrad@ 感谢剧情,剧情不错,信息也很好

标签: r dataframe unique uniqueidentifier substitution


【解决方案1】:
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"))

【讨论】:

  • 感谢 Sotos 的解决方案。这很好用,但是如果我有更多数据,例如: c7
  • @tob,我添加了我使用的数据。用我使用的数据尝试一下,让我知道会发生什么
  • 顺便说一句,我稍微编辑了代码,所以重新复制并粘贴它
  • @Sotos,我的问题就在这里。当我们使用 na.omit 并制作模式时,即使有唯一的行,我们也会丢失相似的模式。例如:如果我们添加另一行“c8
  • 好的,我们可以对 NA 索引做一些事情,但我现在没有时间。
【解决方案2】:

我的解决方案是:

1) 取行中所有没有 NA 的唯一解。

2) 在有 NA 的那些中,看看其余的值是否与另一行相同

重现数据

df<-data.frame(V1 = rep(2,times = 6),
    V2 = c(1,1,1,2,1,NA),
    V3=c(3,3,4,3,3,3),
    V4=c(NA,3,3,NA,3,NA))

创建两个唯一的数据框(一个有 NA,另一个没有

df1<-unique(df[apply(df,MARGIN=1,FUN =function(z) sum(is.na(z)))==0,])
df2<-unique(df[apply(df,MARGIN=1,FUN =function(z) sum(is.na(z)))>0,])

从符合您的条件的 NA 添加行

for(i in 1:nrow(df2)){
  vec<-df2[i,] 
  w<-is.na(vec)
  if(nrow(merge(vec[!w],df1[,w]))>0){ ###I remove columns where you have NAs
    df1<-rbind(df1,vec)
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多