r - 如何选择R中每行(不是所有列)的最大值并变异2列,即最大值和名称?

标签 r tidyverse

这是原始数据框。我想知道“a”和“b”之间的最大值,并将最大值和变量名称变异为两列。

df <- data.frame(lon = c(102,103,104,105),
                 lat = c(31,32,33,34),
                 a = c(4,3,7,6),
                 b = c(5,2,4,9))

目标数据框是这样的。

dftarget <- data.frame(lon = c(102,103,104,105),
                       lat = c(31,32,33,34),
                       a = c(4,3,7,6),
                       b = c(5,2,4,9),
                       max = c(5,3,7,9),
                       type = c('b','a','a','b'))

最佳答案

方法1

只需使用pmaxmax.col函数即可识别最大值和列。

library(dplyr)

df %>% mutate(max = pmax(a,b), type = colnames(df)[max.col(df[,3:4]) + 2 ])

方法2

或者首先将数据重新调整为“长”格式,以便于操作。然后使用 mutate 提取 max 值和名称。最后将其更改回“宽”格式并根据您的目标重新定位列。

df %>% 
  pivot_longer(a:b, names_to = "colname") %>% 
  group_by(lon, lat) %>% 
  mutate(max = max(value), 
         type = colname[which.max(value)]) %>% 
  pivot_wider(everything(), names_from = "colname", values_from = "value") %>% 
  relocate(max, type, .after = b)

输出

# A tibble: 4 × 6
# Groups:   lon, lat [4]
    lon   lat     a     b   max type 
  <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1   102    31     4     5     5 b    
2   103    32     3     2     3 a    
3   104    33     7     4     7 a    
4   105    34     6     9     9 b    

关于r - 如何选择R中每行(不是所有列)的最大值并变异2列,即最大值和名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71822562/

相关文章:

r - 无法使用map_dbl进行总结

R dplyr 总结错误?

r - 在 dplyr 链中实现值(value)

r - 在 select_ 中构造变量名

r - 按变量对 geom_tile 图的 y 轴进行排序

r - 使用并行应用后如何保留数据框形式的列表

R:列出所有无方向的圆形排列/排列(即顺时针/逆时针相同)

r - 在具有任意维度的数组中查找行

r - 使用 group_by 创建相关性和 p 值的数据框,然后在 R 中绘制误差条

根据 R 中另一个数据帧中给出的条件,用 NA 替换数据帧中的多个值