如何用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
相关产品推荐
相关产品推荐

