提问人:Eric Boorman 提问时间:8/4/2023 更新时间:8/4/2023 访问量:44
检查 r 中的多列是否相同(缺少数据)
Check if multiple columns are identical in r (with missing data)
问:
我正在尝试确定 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()。我不确定如何用大量变量来解决这个问题。
答:
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>
评论
id
id
id