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

时间:2018-04-16 05:02:21

标签: r database analysis data-science

我有一个包含许多变量的数据集,包括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%。

1 个答案:

答案 0 :(得分:1)

我们可以循环遍历数据集行,获取值的频率,检查最高频率值是否不超过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