确定跨多个变量的相同响应的百分比

determining the percent of identical responses across multiple variables

我有一个包含很多变量的数据集,包括 26 个变量,所有变量的值都在 1-12 之间。我想删除至少 80% 的值相同的所有行(超过 21 个 1,或超过 21 个 2,等等)。我在想出在 R 中执行此操作的方法时遇到了麻烦,非常感谢有关如何解决此问题的一些想法!

当我 运行

out <- df1[apply(df1, 1, function(x) mean(x == Mode(x)) <= 0.8),] 

在一组变量子集上编码,另一组变量的值全部变为NA。

这里有 60 行数据集,包含来自所有三个条件的 5 个问题:https://nofile.io/f/gBWymjYmQ2O/dataset

我的预期输出是 df1(具有 100 多个变量),其中删除了对 26 个感兴趣的变量具有大于 80% 相同响应的行。

我们可以遍历数据集的行,获取值的频率,检查最高频率值是否不超过 80% 以创建逻辑 vector 并根据该值删除行

Mode <- function(x) {
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
} 

out <- df1[apply(df1, 1, function(x)  mean(x == Mode(x)) <= 0.8),]

更新

根据OP的数据集,行中有NA,有些行全是NA。我们可以更改代码以删除那些具有所有 NA 的行和具有 80% 相同值的行

Mode <- function(x) {
 ux <- unique(x[!is.na(x)])
 ux[which.max(tabulate(match(x, ux)))]
 } 

df1[ apply(df1, 1, function(x)  mean(x == Mode(x), na.rm = TRUE) <= 0.8 & !all(is.na(x))),]

数据

set.seed(24)
df1 <- as.data.frame(matrix(sample(1:12, 26 *20, replace = TRUE), ncol = 26))
df1[c(1, 3, 7),1:21] <- 5