首页 > 解决方案 > 如何融化关于所有变量的矩阵,其中 id 变量是 row.names?

问题描述

我有一个矩阵,我使用 tapply 生成的。
它看起来像这样:

      NON-ROAD NONPOINT   ON-ROAD     POINT
1999 522.94000 2107.625 346.82000  296.7950
2002 240.84692 1509.500 134.30882  569.2600
2005 248.93369 1509.500 130.43038 1202.4900
2008  55.82356 1373.207  88.27546  344.9752

如您所见,我没有任何 id 变量可用于将所有 4 列合并为一列。

数据集大小约为 30MB:数据

生成矩阵:

NEI <- readRDS("summarySCC_PM25.rds")
data <-  with(NEI[NEI$fips=="24510",],tapply(Emissions,list(year,type),sum))

> class(data)
[1] "matrix"

预期输出:

   Year   Type     Emission
1  1999 NON-ROAD  522.94000
2  2002 NON-ROAD  240.84692
3  2005 NON-ROAD  248.93369
4  2008 NON-ROAD   55.82356
5  1999 NONPOINT 2107.62500
6  2002 NONPOINT 1509.50000
7  2005 NONPOINT 1509.50000
8  2008 NONPOINT 1373.20731
9  1999  ON-ROAD  346.82000
10 2002  ON-ROAD  134.30882
11 2005  ON-ROAD  130.43038
12 2008  ON-ROAD   88.27546
13 1999    POINT  296.79500
14 2002    POINT  569.26000
15 2005    POINT 1202.49000
16 2008    POINT  344.97518

此外,我还看到了可以使用aggregate. 但是在我的作业中,我不能使用该功能来与我的其他答案保持一致。

如果可能的话,如果解决方案由原生 R 函数完成,那也很棒。

标签: r

解决方案


一种方法是将您的数据转换为数据框,添加年份列和reshape您的数据。

result <- reshape(data.frame(data, year = rownames(data), check.names = FALSE), 
                  direction = "long", varying = list(colnames(data)), 
                  v.names = "Emission", times = colnames(data), 
                  idvar = 'year', timevar = 'Type')
rownames(result) <- NULL
result

使用tidyverse函数我们可以做到:

library(tibble)
library(tidyr)

data %>%
  as.data.frame() %>%
  rownames_to_column('year') %>%
  pivot_longer(cols = -year, names_to = 'Type', values_to = 'Emission')

#   year  Type     Emission
#   <chr> <chr>       <dbl>
# 1 1999  NON.ROAD    523. 
# 2 1999  NONPOINT   2108. 
# 3 1999  ON.ROAD     347. 
# 4 1999  POINT       297. 
# 5 2002  NON.ROAD    241. 
# 6 2002  NONPOINT   1510. 
# 7 2002  ON.ROAD     134. 
# 8 2002  POINT       569. 
# 9 2005  NON.ROAD    249. 
#10 2005  NONPOINT   1510. 
#11 2005  ON.ROAD     130. 
#12 2005  POINT      1202. 
#13 2008  NON.ROAD     55.8
#14 2008  NONPOINT   1373. 
#15 2008  ON.ROAD      88.3
#16 2008  POINT       345. 

数据

data <- structure(c(522.94, 240.84692, 248.93369, 55.82356, 2107.625, 
1509.5, 1509.5, 1373.207, 346.82, 134.30882, 130.43038, 88.27546, 
296.795, 569.26, 1202.49, 344.9752), .Dim = c(4L, 4L), .Dimnames = list(
    c("1999", "2002", "2005", "2008"), c("NON.ROAD", "NONPOINT", "ON.ROAD", "POINT")))

推荐阅读