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

如何在R语言中转置分组数据中的指定年度列?

解决方案:用Tidyverse实现数据转置

这里有个简洁易上手的方案,用tidyverse工具链就能轻松实现你想要的转置效果,步骤如下:

1. 加载所需包

首先确保你已经安装了tidyverse,如果没安装先执行安装命令:

install.packages("tidyverse")
library(tidyverse)

2. 清洗原始数据

原始数据里每个公司只有第一行包含2006和2007年的有效统计值,其他行都是重复的董事信息且统计列全为NA,我们先提取出有效行:

# 按公司分组,提取每组第一行(含完整统计数据的行)
df_clean <- df %>%
  group_by(CompanyID) %>%
  slice(1) %>%
  ungroup() %>%
  # 只保留需要的标识列和目标统计列
  select(CompanyID, Name, Country, ISIN,
         contains("Findex"), contains("Fperce"), contains("Blauindex"), contains("Total"))

3. 转置数据到目标格式

用pivot_longer把宽格式的年份列转成长格式,同时拆分列名中的指标和年份:

df_final <- df_clean %>%
  pivot_longer(
    cols = -c(CompanyID, Name, Country, ISIN), # 排除不需要转置的标识列
    names_to = c(".value", "Year"), # 把列名拆分为指标列和年份列
    names_pattern = "(Findex|Fperce|Blauindex|Total)(\\d{4})" # 正则匹配指标和年份
  ) %>%
  mutate(Year = as.integer(Year)) %>% # 把年份转成整数类型
  select(Name, CompanyID, ISIN, Country, Year, Findex, Fperce, Blauindex, Total) # 调整列顺序匹配预期

4. 查看结果

运行后df_final就是你想要的格式:

print(df_final)

输出结果:

# A tibble: 4 × 9
  Name    CompanyID ISIN       Country  Year Findex Fperce Blauindex Total
  <chr>       <int> <chr>      <chr>   <int>  <int>  <dbl>     <dbl> <int>
1 BANKxxx     25830 AT000504   Austria  2006      1    0.4      0.48     5
2 BANKxxx     25830 AT000504   Austria  2007      1    0.2      0.32     5
3 BANKyyy     12339 AT034003   Belgium  2006      0    0        0        2
4 BANKyyy     12339 AT034003   Belgium  2007      0    0        0        2

关键步骤说明

  • slice(1):每个公司只保留第一行有效统计数据,过滤掉重复的董事信息行
  • pivot_longer的names_pattern:用正则表达式匹配列名,把Findex2006这类列拆分为指标Findex和年份2006,.value参数让指标部分成为新的列名
  • 最后调整列顺序,完全匹配你给出的预期输出格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:47:21