我有一个如下数据框。我想找到独特的行(唯一性)。但在这些数据中我有'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
答案 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()
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))
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,])