найти равные строки между кадрами данных, включая NA в качестве значения - PullRequest
1 голос
/ 23 апреля 2019

У меня есть два фрейма данных:

df = structure(list(x = c(NA, NA, "b", "b", "b"), y = c("f", "f", 
"f", "g", "g")), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

df2 = structure(list(x = c(NA, NA, "a", "b", "b"), y = c("g", "f", 
"f", "g", "g")), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

Я хотел бы найти одинаковые строки, рассматривая NA как значение.

df == df2

В соответствии с этим вторые строки должны быть «ИСТИНА». Вместо этого мы получаем NA. Хотя логика для этого ясна, можем ли мы изменить df == df2, чтобы эти строки считались равными?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Один из вариантов: replace NA со значением, отсутствующим в наборах данных, выполните сравнение и проверьте, равны ли все строки с rowSums

rowSums(replace(df2, is.na(df2), "0") == replace(df, is.na(df), "0"))== 2
#[1] FALSE  TRUE FALSE  TRUE  TRUE

илибез замены создайте логическое условие с is.na

rowSums((!is.na(df) & df== df2)|(is.na(df))) == ncol(df)
1 голос
/ 23 апреля 2019

Можно paste и сравнить, т.е.

do.call(paste, df) == do.call(paste, df2)
#[1] FALSE  TRUE FALSE  TRUE  TRUE
...