R语言如何将双列单行数据框组成的列表合并为两列数据框
解决方案
你可以通过以下任意一种方式完成列表到规整数据框的转换:
- 尽量少改现有代码的前提下,在循环运行后加几行转换代码即可得到结果
- 也可以调整原循环的初始化逻辑,从源头直接生成目标结构的数据框,省去后续转换步骤
方法1:基于已加载的dplyr快速转换(推荐,代码最简洁)
dplyr包的bind_rows()可以直接按行合并列表内的所有子数据框,之后重命名波动率列即可得到目标结构:
# 合并列表中所有子数据框 vol_df <- bind_rows(vol_final) %>% # 将原vol_i列重命名为要求的volatility rename(volatility = vol_i)
运行后vol_df就是标准两列数据框,列名、结构和你给出的示例完全一致。
方法2:Base R原生实现,无需依赖第三方包
如果不想调用dplyr,用R自带的do.call()+rbind()就能完成行合并,再修改列名即可:
vol_df <- do.call(rbind, vol_final) # 修改第二列的列名 colnames(vol_df)[2] <- "volatility"
方法3:优化原循环逻辑,直接生成目标数据框
你可以把初始化的空对象从列表改成空数据框,循环中直接逐行追加结果,跑完循环就直接得到规整结果,不需要二次转换:
library(dplyr) # 初始化空结果数据框,提前指定列名和对应数据类型 vol_final <- data.frame( year = integer(), volatility = numeric() ) for (i in 2000:2022) { data_hv_i <- data_hv %>% filter(Year == i) price_i = data_hv_i$Wheat ret <- log(lag(price_i)) - log(price_i) vol_i <- sd(ret, na.rm = TRUE) * sqrt(nrow(data_hv_i)) * 100 # 直接将当年结果追加到结果数据框 vol_final <- rbind(vol_final, data.frame(year = i, volatility = vol_i)) }
内容的提问来源于stack exchange,提问作者user19304348
相关产品推荐
相关产品推荐

