如何用R语言生成含特定列最大值对应变量名的新DataFrame?
R语言提取每行最大值对应的列名并生成新DataFrame
示例输入数据
先模拟你的输入DataFrame,方便验证代码效果:
df <- data.frame( wind = c(5, 10, 15), ROS = c(0.2, 0.5, 0.8), T_0.1 = c(10, 20, 15), T_0.2 = c(15, 18, 20), T_0.3 = c(12, 25, 18), T_180.1 = c(8, 12, 9), T_180.2 = c(10, 15, 12), T_180.3 = c(9, 18, 10) )
方法一:Base R实现
无需额外安装包,直接用基础函数完成:
# 筛选出以T_0.和T_180.开头的列名 t0_cols <- grep("^T_0\\.", names(df), value = TRUE) t180_cols <- grep("^T_180\\.", names(df), value = TRUE) # 逐行提取最大值对应的列名 df$new_T0 <- apply(df[t0_cols], 1, function(x) names(x)[which.max(x)]) df$new_T180 <- apply(df[t180_cols], 1, function(x) names(x)[which.max(x)]) # 保留目标列生成新DataFrame new_df <- df[, c("wind", "ROS", "new_T0", "new_T180")]
方法二:Tidyverse实现
如果习惯用dplyr/tidyr的管道语法,代码更直观:
library(dplyr) library(tidyr) new_df <- df %>% rowwise() %>% # 提取T_0.列中最大值对应的列名 mutate(new_T0 = names(select(., starts_with("T_0.")))[which.max(c_across(starts_with("T_0.")))]) %>% # 提取T_180.列中最大值对应的列名 mutate(new_T180 = names(select(., starts_with("T_180.")))[which.max(c_across(starts_with("T_180.")))]) %>% ungroup() %>% # 选择最终需要的列 select(wind, ROS, new_T0, new_T180)
结果验证
运行上述代码后,new_df的输出如下:
> new_df wind ROS new_T0 new_T180 1 5 0.2 T_0.2 T_180.2 2 10 0.5 T_0.3 T_180.3 3 15 0.8 T_0.2 T_180.2
注意事项
如果某一行中存在多个相同的最大值,which.max()会返回第一个出现该最大值的列名。如果需要提取所有最大值对应的列名,可以将函数修改为:
# 示例:提取所有最大值对应的列名(以T_0.为例) df$new_T0_all <- apply(df[t0_cols], 1, function(x) paste(names(x)[x == max(x)], collapse = ","))
内容的提问来源于stack exchange,提问作者Raquel Feltrin
相关产品推荐
相关产品推荐

