如何在R语言中将列转置为行并按需重复对应数据行?
在R中将宽格式数据转为长格式(列转行并重复对应行)
你需要将宽格式的汇率数据转换为长格式,使每种货币作为单独一行,同时重复对应的日期、年、月、日信息。以下是两种常用的实现方法:
第一步:构造示例数据集
先还原你提供的数据集:
df <- data.frame( Date = c("1994-1-1", "1995-1-1"), Year = c(1994, 1995), Month = c(1, 1), Day = c(1, 1), USD = c(10, 12), EUR = c(20, 30), JPY = c(5, 10) )
方法一:使用tidyr包的pivot_longer()(推荐)
这是tidyverse生态下的标准方法,语法直观易读:
library(tidyr) long_df <- pivot_longer( data = df, cols = c(USD, EUR, JPY), # 指定需要转置为行的列 names_to = "Currency", # 原列名存入新列"Currency" values_to = "Currency/CCY" # 原列的数值存入新列"Currency/CCY" ) # 查看转换后的结果 print(long_df)
转换后的输出:
# A tibble: 6 × 6 Date Year Month Day Currency `Currency/CCY` <chr> <dbl> <dbl> <dbl> <chr> <dbl> 1 1994-1-1 1994 1 1 USD 10 2 1994-1-1 1994 1 1 EUR 20 3 1994-1-1 1994 1 1 JPY 5 4 1995-1-1 1995 1 1 USD 12 5 1995-1-1 1995 1 1 EUR 30 6 1995-1-1 1995 1 1 JPY 10
方法二:使用reshape2包的melt()
如果你习惯使用reshape系列工具,可以用melt()函数实现:
library(reshape2) long_df <- melt( data = df, id.vars = c("Date", "Year", "Month", "Day"), # 指定不需要转置的标识列 variable.name = "Currency", # 存储原列名的新列名 value.name = "Currency/CCY" # 存储原列数值的新列名 ) # 查看转换后的结果 print(long_df)
此方法的输出与方法一完全一致。
内容的提问来源于stack exchange,提问作者Sri Sreshtan
相关产品推荐
相关产品推荐

