如何在R中遍历数据框列、应用spread并生成新数据框?
批量将DataFrame按变量转换为宽格式的方法
首先先还原你的原始数据,方便后续演示:
df <- data.frame( Name = c("Peter", "Ben", "Mary"), date = as.Date(c("2020-03-30", "2020-10-14", "2020-12-06")), var1 = c(0.4, 0.6, 0.7), var2 = c(0.5, 0.4, 0.2), var3 = c(0.2, 0.1, 0.9) )
方法1:基础R循环(适合新手理解)
利用循环遍历所有变量列,逐个转换为宽格式后存入列表,避免全局环境混乱:
library(tidyr) # 自动获取所有变量列(第3列及以后) var_cols <- names(df)[3:ncol(df)] # 创建空列表存储结果 result_list <- list() # 循环处理每个变量 for (var in var_cols) { # 提取当前变量所需的列 temp_df <- df[, c("date", "Name", var)] # 转换为宽格式 wide_df <- spread(temp_df, key = Name, value = all_of(var)) # 以变量名作为列表元素名存入结果 result_list[[var]] <- wide_df }
调用结果时直接用列表索引,比如result_list$var1就能得到你需要的var1对应宽格式DataFrame:
print(result_list$var1) # date Peter Ben Mary # 1 2020-03-30 0.4 NA NA # 2 2020-10-14 NA 0.6 NA # 3 2020-12-06 NA NA 0.7
方法2:tidyverse批量处理(更简洁)
用purrr包的map函数实现批量操作,代码更紧凑:
library(tidyr) library(purrr) result_list <- map(var_cols, function(var) { df %>% select(date, Name, all_of(var)) %>% spread(key = Name, value = all_of(var)) }) %>% set_names(var_cols) # 给列表元素命名
如果非要将每个结果单独存入全局环境(不推荐,容易造成环境混乱),可以执行:
list2env(result_list, .GlobalEnv)
内容的提问来源于stack exchange,提问作者Mina
相关产品推荐
相关产品推荐

