在行数NA的数据框中查找唯一性?

时间:2016-03-31 07:39:54

标签: r dataframe unique uniqueidentifier substitution

我有一个如下数据框。我想找到独特的行(唯一性)。但在这些数据中我有'NA'。我喜欢如果NA值的一行中的所有值与其他行相同(如行:1,2,5)我想忽略它,但如果不相同(如行:2,4)我喜欢保留它作为独特的行。 例如,在行1,2和6中,除NA之外的所有值都是相同的,因为NA可以是值'1和3'我想要删除该行并且只保留第2行。 此外,在第6行中,值2和3(不包括NA)与行c2和c5相同,并且c6中可能存在与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

2 个答案:

答案 0 :(得分:2)

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"))

答案 1 :(得分:0)

我的解决方案是:

1)采取行中没有NA的所有唯一解决方案。

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

重现数据

from tkinter import *
from time import sleep

def a():
    for i in range(1000):
        listbox.yview(i)
        sleep(1)

master = Tk()

scrollbar = Scrollbar(master)
scrollbar.pack(side=RIGHT, fill=Y)

listbox = Listbox(master, yscrollcommand=scrollbar.set)
for i in range(1000):
    listbox.insert(END, str(i))
listbox.pack(side=LEFT, fill=BOTH)

scrollbar.config(command=listbox.yview)
Button(master,text="start",command=a).pack()

mainloop()

创建两个唯一的数据框(一个具有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,])