You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用rollapply生成合并函数名与原数据集列名的DataFrame?

问题

使用rollapply执行自定义函数后,能否输出列名为「统计量名称+原数据集列名」(如mean.x、median.x、mx.x)格式的DataFrame?

用户提供的自定义函数、调用代码及示例数据如下:

自定义函数

time_domain_summary <- function(values) {
  features <- data.frame(
    mean = mean(values, na.rm = TRUE),
    median = quantile(values, probs = c(0.5), na.rm = TRUE), 
    mx =  max(values, na.rm = T),
    mn = min(values, na.rm = T), 
    sd = sd(values)
  )
  return(features)
}

rollapply调用代码

feats <- data.frame(rollapply(sensor_data, FUN = time_domain_summary, width = 2, by = 1, by.column = T, align = c("left"), partial = F))

示例数据

sensor_data <- structure(list(
  x = c(-0.45, -0.35, -0.375, -0.325, -0.25, -0.225, -0.125, -0.175, -0.175, -0.35),
  y = c(-0.725, -0.575, -0.8, -0.775, -0.525, -0.625, -0.75, -0.775, -0.725, -0.725),
  z = c(0.775, 0.75, 0.85, 0.875, 0.575, 0.65, 0.85, 0.75, 0.825, 0.675),
  ODBA = c(0.155, 0.14, 0.31, 0.325, 0.37, 0.21, 0.26, 0.23, 0.295, 0.04),
  VeDBA = c(0.110113577727726, 0.0966953980290686, 0.179861057486049, 0.190984292547843, 0.22726636354727, 0.138744369255116, 0.158587515271537, 0.133977610069743, 0.190065778087482, 0.0308220700148449),
  energy = c(1.32875, 1.015625, 1.503125, 1.471875, 0.66875, 0.86375, 1.300625, 1.19375, 1.236875, 1.10375),
  mov.intensity = c(1.15271418833985, 1.00778221853732, 1.22601998352392, 1.21320855585509, 0.817771361689806, 0.929381514772055, 1.1404494727957, 1.09258866917061, 1.11214882097676, 1.05059506947253),
  mov.var = c(0, 0.225, -0.15, 0.1, 0.025, 8.32667268468867e-17, 0.175, -0.175, 0.125, -0.325)
), row.names = c(NA, 10L), class = "data.frame")

解决方案

可以通过两种方式实现目标列名格式:

方法1:修改输出结果的列名

原rollapply在by.column=T模式下,会给每个原列的统计量结果添加.1、.2这类索引后缀,我们只需将这些后缀替换为原数据集的列名即可:

library(zoo)

# 执行原rollapply调用
feats <- data.frame(rollapply(sensor_data, FUN = time_domain_summary, width = 2, by = 1, by.column = T, align = "left", partial = F))

# 获取自定义函数返回的统计量名称
stat_names <- names(time_domain_summary(1:2))
# 获取原数据集的列名
col_names <- names(sensor_data)
# 生成「统计量.原列名」格式的新列名
new_colnames <- as.vector(outer(stat_names, col_names, paste, sep = "."))
# 重命名结果DataFrame的列
colnames(feats) <- new_colnames

方法2:逐列处理并直接指定列名

手动遍历原数据集的每一列,对每列单独执行rollapply,并直接设置对应列名,最后合并结果:

library(zoo)

# 逐列处理,生成带目标列名的结果列表
feats_list <- lapply(col_names, function(col) {
  # 对当前列执行滚动计算
  res <- rollapply(sensor_data[[col]], FUN = time_domain_summary, width = 2, by = 1, align = "left", partial = F)
  # 给结果列添加原列名后缀
  colnames(res) <- paste(colnames(res), col, sep = ".")
  return(res)
})

# 合并所有列的结果
feats <- do.call(cbind, feats_list)

两种方法最终都能得到列名为mean.x、median.x、mx.x这类格式的DataFrame。


内容的提问来源于stack exchange,提问作者PharmR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:35:19