r - 查找一行中所有并列的最大值,如果列包含最大值,则返回 true 或 false
问题描述
我有一些包含数字列的数据:
df <- data.frame(v1 = c(0,1,2,3,4,5,6,7,8,9),
v2 = c(2,1,4,7,6,7,8,9,0,1),
v3 = c(4,1,6,7,8,9,0,1,2,3),
v4 = c(0,1,2,7,4,5,6,7,8,9),
v5 = c(0,1,6,3,6,9,8,9,0,1))
我可以找到第一个最大值并使用 which.max 返回其列名:
df$max <- colnames(df)[apply(df,1,which.max)]
相反,我想添加五个新列,如果相应的列是最大值或与最大值绑定,则插入 TRUE,否则插入 FALSE:
v1 v2 v3 v4 v5 v1max v2max v3max v4max v5max
1 0 2 4 0 0 FALSE FALSE TRUE FALSE FALSE
2 1 1 1 1 1 TRUE TRUE TRUE TRUE TRUE
3 2 4 6 2 6 FALSE FALSE TRUE FALSE TRUE
4 3 7 7 7 3 FALSE TRUE TRUE TRUE FALSE
5 4 6 8 4 6 FALSE FALSE TRUE FALSE FALSE
6 5 7 9 5 9 FALSE FALSE TRUE FALSE TRUE
7 6 8 0 6 8 FALSE TRUE FALSE FALSE TRUE
8 7 9 1 7 9 FALSE TRUE FALSE FALSE TRUE
9 8 0 2 8 0 TRUE FALSE FALSE TRUE FALSE
10 9 1 3 9 1 TRUE FALSE FALSE TRUE FALSE
有没有一种简单的方法可以实现这一目标?
解决方案
一个简单而有效的解决方案是使用数据框获得逐行最大值do.call
,pmax
并将其与数据框进行比较以获得可以分配为新列的逻辑向量。
df[paste0(names(df), "max")] <- df == do.call(pmax, df)
df
# v1 v2 v3 v4 v5 v1max v2max v3max v4max v5max
#1 0 2 4 0 0 FALSE FALSE TRUE FALSE FALSE
#2 1 1 1 1 1 TRUE TRUE TRUE TRUE TRUE
#3 2 4 6 2 6 FALSE FALSE TRUE FALSE TRUE
#4 3 7 7 7 3 FALSE TRUE TRUE TRUE FALSE
#5 4 6 8 4 6 FALSE FALSE TRUE FALSE FALSE
#6 5 7 9 5 9 FALSE FALSE TRUE FALSE TRUE
#7 6 8 0 6 8 FALSE TRUE FALSE FALSE TRUE
#8 7 9 1 7 9 FALSE TRUE FALSE FALSE TRUE
#9 8 0 2 8 0 TRUE FALSE FALSE TRUE FALSE
#10 9 1 3 9 1 TRUE FALSE FALSE TRUE FALSE
一个解决方案apply
可能是
df[paste0(names(df), "max")] <- t(apply(df, 1, function(x) x == max(x)))
推荐阅读
- ruby-on-rails - 如何从 Rails 列表中删除重复的国家/地区?
- java - 如何在java中选择底部图像视图?
- c# - 所有(OOP)依赖项的根存储在哪里?
- azure - 在 Azure DevOps 中,同一作业中的任务可以相互依赖吗?
- css - 当图像占据 > 50% 的屏幕时,如何删除 CSS:Float 属性
- python-3.x - 为什么要使用 batch_length 除以 num_steps 来确定 epoch_size?
- sql-server - 处理数据流任务中派生列中的截断错误
- elasticsearch - 过滤嵌套对象的计数聚合给出不正确的结果
- node.js - 带有 https 代理的 NodeJS EventSource 不起作用
- python - Kmeans 算法的特征缩放