在R中筛选month_pct与year_pct的最值及对应id、price
筛选百分比列的最值并关联对应ID和价格的R实现
我来帮你解决这个问题,这里有两种实用的R语言实现方法,能完美满足你的需求——找出month_pct和year_pct的最大值、最小值,并匹配对应的id和price,最终输出你需要的格式。
首先明确:你的数据中month_pct和year_pct是因子类型,直接计算最值会出错,所以第一步需要先提取百分比的数值部分定位最值位置,再提取原始的百分比字符串。
方法一:使用tidyverse工具包(推荐)
tidyverse的语法更直观,适合后续扩展更多列的需求,步骤如下:
- 先加载tidyverse包(如果没安装先运行
install.packages("tidyverse")) - 自定义一个函数来处理单列百分比的最值提取
- 对两个百分比列应用函数并合并结果
# 加载工具包 library(tidyverse) # 定义提取最值的函数 get_extremes <- function(data, col_name) { # 提取因子中的百分比数值,用于定位最值位置 col_numeric <- parse_number(as.character(data[[col_name]])) # 找到最大值和最小值的索引 max_pos <- which.max(col_numeric) min_pos <- which.min(col_numeric) # 构造该列的结果行 tibble( type = c("max", "min"), pct_type = col_name, pct = c(data[[col_name]][max_pos], data[[col_name]][min_pos]), id = c(data$id[max_pos], data$id[min_pos]), price = c(data$price[max_pos], data$price[min_pos]) ) } # 对两个百分比列应用函数并合并结果 final_result <- bind_rows( get_extremes(df, "month_pct"), get_extremes(df, "year_pct") ) %>% # 添加从0开始的行号 mutate(max_min = row_number() - 1) %>% # 调整列顺序匹配你想要的格式 select(max_min, type, pct_type, pct, id, price) # 查看结果 print(final_result)
运行后你会得到和示例格式一致的输出,代码的可读性和扩展性都很强。
方法二:Base R原生实现
如果你不想加载额外包,用Base R也能完成任务,步骤更直接:
# 处理month_pct列,提取数值并找最值索引 month_vals <- as.numeric(sub("%", "", df$month_pct)) max_month_idx <- which.max(month_vals) min_month_idx <- which.min(month_vals) # 处理year_pct列,同样提取数值并找最值索引 year_vals <- as.numeric(sub("%", "", df$year_pct)) max_year_idx <- which.max(year_vals) min_year_idx <- which.min(year_vals) # 构造最终结果数据框 final_result_base <- data.frame( max_min = 0:3, type = rep(c("max", "min"), 2), pct_type = rep(c("month_pct", "year_pct"), each = 2), pct = c(df$month_pct[max_month_idx], df$month_pct[min_month_idx], df$year_pct[max_year_idx], df$year_pct[min_year_idx]), id = c(df$id[max_month_idx], df$id[min_month_idx], df$id[max_year_idx], df$id[min_year_idx]), price = c(df$price[max_month_idx], df$price[min_month_idx], df$price[max_year_idx], df$price[min_year_idx]) ) # 查看结果 print(final_result_base)
这种方法不需要依赖任何第三方包,代码简洁直接,适合快速处理简单需求。
运行任意一种方法,你都会得到符合要求的结果,比如针对你的示例数据,最终结果会显示:
month_pct的最大值是8.53%(对应id=1,price=40.59),最小值是-19.91%(对应id=10,price=1.77)year_pct的最大值是1.54%(对应id=7,price=54.79),最小值是-35.26%(对应id=1,price=40.59)
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

