ละเว้น NAs ในดาต้าเฟรมเมื่อค้นหาแถวที่ไม่ซ้ำ

ฉันมี dataframe ที่มี 20 คอลัมน์และประมาณ 200 แถว และฉันต้องการค้นหาแถวที่ไม่ซ้ำ ปัญหาคือเกือบทุกแถวมี NA สองสามตัวปะปนอยู่ นี่เป็นข้อมูลที่ขาดหายไปจริงๆ และฉันต้องการให้ NA ได้รับการปฏิบัติเหมือนเป็น "ไวลด์การ์ด" ไม่ใช้เพื่อให้ตรงกับ NA อื่นๆ

สองแถวต่อไปนี้ควรได้รับการยอมรับว่าตรงกัน (เช่น ไม่ซ้ำกัน)

T, S, NA, Z
NA, S, G, Z

ฉันได้ลองใช้อาร์กิวเมนต์ที่ไม่มีใครเทียบได้กับฟังก์ชันเฉพาะแล้ว แต่ดูเหมือนว่าจะไม่ได้ถูกนำมาใช้ ขอบคุณมาก.


person Patrick Turko    schedule 19.11.2014    source แหล่งที่มา
comment
ฉันอัปเดตรหัสแล้ว คุณช่วยตรวจสอบได้ไหมว่านี่คือสิ่งที่คุณต้องการ   -  person akrun    schedule 19.11.2014


คำตอบ (2)


ใส่สิ่งนี้ลงใน double for loop:

all(na.omit(x[1,] == x[2,]))

แทนที่ 1 และ 2 ด้วย i และ j เพื่อวนดูการเปรียบเทียบทั้งหมดที่คุณต้องตรวจสอบ

person ARobertson    schedule 19.11.2014

คุณสามารถลอง

val <-  apply(df, 1, function(x) {paste(na.omit(x), collapse='')})
df[!duplicated(val),]
#    V1 V2   V3 V4
#1    T  S <NA>  Z
#2 <NA>  S    G  Z
#3    S  G    Z  T

ข้อมูล

 df <- structure(list(V1 = c("T", NA, "S", "S", "S"), V2 = c("S", "S", 
 "G", NA, "G"), V3 = c(NA, "G", "Z", "Z", NA), V4 = c("Z", "Z", 
 "T", "G", "Z")), .Names = c("V1", "V2", "V3", "V4"), row.names = c(NA, 
 -5L), class = "data.frame")
person akrun    schedule 19.11.2014
comment
ขอบคุณ แต่ลำดับของค่าในแถวมีความสำคัญ - person Patrick Turko; 19.11.2014