r - 使用 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)
解决方案
首先,定义一个函数来计算众数。我使用了这里找到的函数: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"
推荐阅读
- r - 从包含符号的连续数据中删除 data.frame 中的行
- xml - sed 异常 / if else 条件删除 xml 上的单词
- javascript - 使用 Javascript 进行 Base64 编码的 HMAC 散列
- c# - MissingMethodException C# NET 标准
- php - 从 PHP 文件连接 Sybase
- java - 如何使用核心java在selenium中从内部框架切换到默认页面
- ruby-on-rails - 使用 Rails 在唯一用户电子邮件(带转发)下以电子邮件形式发送表单
- typescript - Typescript KeyOf - 数组或对象 - 绝望
- android - Android QR阅读器使用zxing显示白色空活动
- python - Python 接受参数