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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:18:18