如何用mutate为tibble新增列,标记各俱乐部的偏好饮品?
问题与解决方案
问题描述
我拥有一个名为football_supporters的dataframe,数据结构如下:
Mun_Code Code Municipality Club Coca_Cola Fanta Sprite 3 11 NYC Sharks 152 92 148 3 12 NYC Wolfs 93 72 54 3 13 NYC Dogs 143 67 38 3 14 NYC Cats 32 99 156 #With 200 more rows
我希望通过mutate()函数新增一列Drink,用来统计每个俱乐部偏好的饮品(即该行Coca_Cola、Fanta、Sprite三个数值中最大的对应的饮品名称),同时调整部分列的格式,预期输出如下:
Acode Code Clubname Drink 11 0111 Sharks Coca_Cola 12 0112 Wolfs Coca_Cola 13 0113 Dogs Coca_Cola 14 0114 Cats Sprite #With 200 more rows
我尝试了如下代码,但无法实现需求:
colMax <- function(football_supporters) sapply(football_supporters, max, na.rm = TRUE)
解决方案
你之前的函数是计算每列的最大值,而需求是获取每行最大值对应的饮品名称,用dplyr结合max.col()可以轻松实现:
核心实现(仅新增Drink列)
library(dplyr) football_supporters <- football_supporters %>% mutate( Drink = c("Coca_Cola", "Fanta", "Sprite")[ max.col(select(., Coca_Cola, Fanta, Sprite), ties.method = "first") ] )
完整匹配预期输出(含列格式调整)
如果需要同时生成Acode、格式化Code、重命名Club为Clubname,可以一起处理:
library(dplyr) football_supporters <- football_supporters %>% mutate( Acode = Code, Code = sprintf("011%d", Code), # 按示例格式生成带前缀的Code Clubname = Club, # 匹配每行最大值对应的饮品 Drink = c("Coca_Cola", "Fanta", "Sprite")[ max.col(select(., Coca_Cola, Fanta, Sprite), ties.method = "first") ] ) %>% select(Acode, Code, Clubname, Drink) # 筛选出预期输出的列
关键说明
select(., Coca_Cola, Fanta, Sprite):精准选中需要比较的三列,避免其他数值列干扰max.col(..., ties.method = "first"):返回每行最大值所在的列索引;若遇多个并列最大值,ties.method参数可指定处理规则(比如"random"随机选一个)- 用向量
c("Coca_Cola", "Fanta", "Sprite")根据索引映射出对应的饮品名称
内容的提问来源于stack exchange,提问作者Henry Oufh
相关产品推荐
相关产品推荐

