检查 r 中的多列是否相同(缺少数据)

Check if multiple columns are identical in r (with missing data)

提问人:Eric Boorman 提问时间:8/4/2023 更新时间:8/4/2023 访问量:44

问:

我正在尝试确定 R 中的多列是否彼此相同。每个变量都包含字符串数据。示例可能如下所示。文件中缺少一些数据。

            df <- data.frame (id  = c(1:9),
                              var1  = c("a", "b", "c", "a", "a", "a", "c", "a", "b"),
                              var2  = c("a", "b", NA, "a", "a", "a", "c", "a", "b"),
                              var3  = c("a", "b", "c", "a", "a", "b", "c", "a", "b"),
                              var4  = c("a", "b", "c", "b", "a", "b", "c", "a", "b"),
                              var5  = c("a", NA, "c", "b", "a", NA, "c", "a", "b"),
                              var6  = c("a", NA, "c", "a", "c", NA, "c", "a", "b"),
                              var7  = c("a", NA, "c", "a", "c", "b", "c", "a", "b"),
                              var8  = c("a", "b", "c", "a", "c", "a", "c", "a", "b"),
                              var9  = c("a", "b", "c", "a", "c", "a", "c", "a", "b"),
                              var10  = c("a", "b", "c", "a", "c", NA, "c", "a", "b")
     )

我想识别变量之间的任何变化差异,同时忽略缺失的数据(例如,在 id 4 中,除了 var4 和 var5 是 b 之外,所有变量都是“a”。
我正在尝试导出显示 id 和所有变量的数据帧。

output
id var1 var2 var3 var4 var5 var6 var7 var8 var9 var10
4     a    a    a    b    b    a    a    a    a    a
5     a    a    a    a    a    c    c    c    c    c
...

我可以为可能发生的每种情况创建一个标志变量。

df$flag [df$var1 == "a" & df$var2 == "a" & df$var2 == "a" & df$var4 == "a" & df$var5 == "a" & df$var6 == "a" & df$var7 == "a" & df$var8 == "a" & df$var9 == "a" & df$var10 == "b"]<- 1
df$flag [df$var1 == "a" & df$var2 == "a" & df$var2 == "a" & df$var4 == "a" & df$var5 == "a" & df$var6 == "a" & df$var7 == "a" & df$var8 == "a" & df$var9 == "a" & df$var10 == "c"]<- 1
df$flag [df$var1 == "a" & df$var2 == "a" & df$var2 == "a" & df$var4 == "a" & df$var5 == "a" & df$var6 == "a" & df$var7 == "a" & df$var8 == "a" & df$var9 == "b" & df$var10 == "b"]<- 1
df$flag [df$var1 == "a" & df$var2 == "a" & df$var2 == "a" & df$var4 == "a" & df$var5 == "a" & df$var6 == "a" & df$var7 == "a" & df$var8 == "a" & df$var9 == "c" & df$var10 == "c"]<- 1
    ...
                

这似乎不是一个理想的解决方案,因为我需要编码的情况太多了,其中许多甚至可能不会发生在数据帧中。

我尝试使用unique,但这只是识别各种模式。我仍然需要为它们中的每一个编写代码。由于数据是字符串,我不能使用 var()。在较小的范围内,当只有两个变量时,我可以使用 == 或 identical()。我不确定如何用大量变量来解决这个问题。

R 向量 缺失数据 相等

评论

0赞 LMc 8/4/2023
是否标识行中是否有重复值?你是想按行还是按?ididid
1赞 Eric Boorman 8/4/2023
按同上。在我正在处理的数据集中,我有几个不同的变量用于 id。我能够修改下面的代码以考虑额外的 id 变量。.by = c (“id”, “second_id_variable”, “third_id_variable”)。dplyr 解决方案奏效了。我找到了 n_distinct (dplyr.tidyverse.org/reference/n_distinct.html) 的文档。

答:

1赞 LMc 8/4/2023 #1
library(dplyr)

df |>
  filter(n_distinct(c_across(starts_with("var")), na.rm = T) > 1, .by = id)

在 base R 中按行执行此操作的一种方法是:

df[apply(df[-1], 1, \(x) nlevels(factor(x))) > 1,]

输出

  id var1 var2 var3 var4 var5 var6 var7 var8 var9 var10
1  4    a    a    a    b    b    a    a    a    a     a
2  5    a    a    a    a    a    c    c    c    c     c
3  6    a    a    b    b <NA> <NA>    b    a    a  <NA>