【问题标题】:compare between more than 2 vectors in R (Voting)比较 R 中超过 2 个向量(投票)
【发布时间】:2017-05-07 09:14:05
【问题描述】:

我有 5 个向量,这些向量中的每个项目要么是“是”,要么是“否” 所以我想比较这 5 个向量(逐行)并计算每一行的多数投票并将结果添加到一个新向量中。 我怎样才能有效地做到这一点。

v1=c("yes","no","no","yes")
v2=c("no","no","yes","yes")
v3=c("yes","yes","no","yes")
v4=c("yes","no","yes","yes")
v5=c("yes","yes","yes","no")
#The expected output is "yes", "no", "yes", "yes"

【问题讨论】:

    标签: r


    【解决方案1】:

    首先将数据放入基于字符的形式中:

    dat <- data.frame( v1=c("yes","no","no","yes"),
                      v2=c("no","no","yes","yes"),
                      v3=c("yes","yes","no","yes"),
                      v4=c("yes","no","yes","yes"),
                      v5=c("yes","yes","yes","no"), stringsAsFactors=FALSE)
    

    然后拉出一个表对象的最大值的名称:

     apply(dat, 1, function(x) names(which.max(table(x))) )
    [1] "yes" "no"  "yes" "yes"
    

    【讨论】:

    • 如果将数据存储为因子,它也可以工作,就像“标准”data.frame 的情况一样
    【解决方案2】:

    另一种方法是使用 mapply== 来返回一个 TRUE 和 FALSE 矩阵,比较向量的元素是否等于某个值(此处为“是”)。然后rowMeans 计算跨行的比例,&gt; 0.5 检查多数。我们加 1 以转换为数字位置,然后将其用作从c("no", "yes") 中的元素中选择的位置。

    c("no", "yes")[(rowMeans(mapply("==", moreArgs=list("yes"), myList)) > 0.5) + 1L]
    [1] "yes" "no"  "yes" "yes"
    

    使用矩阵乘法的替代方法是

    c("no", "yes")[((do.call(cbind, myList) == "yes") %*%
                   rep(1, length(myList)) > (length(myList) / 2)) + 1L]
    [1] "yes" "no"  "yes" "yes"
    

    请注意,首先将向量放在下面的列表中。

    数据

    myList <- list(v1=c("yes","no","no","yes"),
                   v2=c("no","no","yes","yes"),
                   v3=c("yes","yes","no","yes"),
                   v4=c("yes","no","yes","yes"),
                   v5=c("yes","yes","yes","no"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多