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

