首页 > 解决方案 > 使用 dplyr 哪个字段不同?

问题描述

我有以下数据

df <- data.frame(val1=c(1.2,0.5,3.8,2.5,7.4),
                 val2=c(1.2,2.5,3.8,2.5,2.4),
                 val3=c(1.2,2.5,3.6,2.5,7.4),
                 val4=c(1.2,2.5,3.8,2.5,4.4),
                 val5=c(1.2,2.5,3.8,2.9,7.4))

我想找出与其他领域不同的领域。期望将如下结果添加到数据框中

cbind(df,results = c("all_equal", "val1","val3","val5","morethan1"))

有没有办法以简单的方式做到这一点?我有一个广泛的循环来获得这个结果,我不会在这里发布。我正在寻找一个我错过的快速解决方案(也许使用 dplyr)

标签: rdplyr

解决方案


首先,定义一个函数来计算众数。我使用了这里找到的函数:https ://stackoverflow.com/a/8189441/7669809

Modes <- function(x) {
  ux <- unique(x)
  tab <- tabulate(match(x, ux))
  ux[tab == max(tab)]
}

之后,我们可以使用以下代码来获得所需的输出。

apply(df, 1, function(x){
  x_mode <- Modes(x)
  if (all(x == x_mode)){
    return("all_equal")
  } else if (sum(x != x_mode) > 1){
    return("morethan1")
  } else {
    ind <- which(x != x_mode)
    return(paste0("val", ind))
  }
})
# [1] "all_equal" "val1"      "val3"      "val5"      "morethan1"

推荐阅读