如何为R语言DataFrame所有列查找Peaks和Valleys并替换对应位置为1?
批量处理DataFrame列标记峰值与谷值
当然可以批量处理所有列,下面提供两种常用实现方式:
基础R实现
首先确保你已经加载了quantmod包(findPeaks和findValleys函数来自这个包),然后定义一个处理单列的函数,再用apply遍历所有列:
# 加载依赖包 library(quantmod) # 定义处理单列的函数:标记峰值和谷值为1,其余为0 mark_peaks_valleys <- function(col) { peaks <- findPeaks(col, thresh = 0) valleys <- findValleys(col, thresh = 0) result <- rep(0, length(col)) # 合并峰值和谷值位置,统一替换为1 result <- replace(result, c(peaks, valleys), 1) return(result) } # 批量处理所有列 df_processed <- as.data.frame(apply(df, 2, mark_peaks_valleys))
apply(df, 2, mark_peaks_valleys)会按列遍历原DataFrame,将每一列传入自定义函数处理,最后把返回的矩阵转换回DataFrame格式。
tidyverse(dplyr)实现
如果你习惯用tidyverse语法,可以用dplyr::across来批量处理所有列:
library(dplyr) library(quantmod) df_processed <- df %>% mutate(across(everything(), ~{ peaks <- findPeaks(.x, thresh = 0) valleys <- findValleys(.x, thresh = 0) res <- rep(0, length(.x)) replace(res, c(peaks, valleys), 1) }))
across(everything(), ...)会对DataFrame的所有列执行花括号内的逻辑,代码更贴合管道式编程风格。
内容的提问来源于stack exchange,提问作者nando_5g
相关产品推荐
相关产品推荐

