r - 如何融化关于所有变量的矩阵,其中 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 函数完成,那也很棒。
解决方案
一种方法是将您的数据转换为数据框,添加年份列和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")))
推荐阅读
- javascript - 这 2 个 windows.onscroll javascript 代码不能一起工作
- apache-spark - 调整 Spark:当可用内核不均匀时每个节点的执行器数量
- javascript - 将对象值转换为大写
- safari - VoiceOver 左右箭头键保留用于预定义行为。如何覆盖?
- python - 循环自定义类
- javascript - Angular 8 使用 Internet Explorer 11 的异步管道
- vb.net - 如何从 15 个数字中找出最大的数字?
- python - 从获取响应中提取价值
- java - MarkerOptions.position 中的 NullPointer 与 Android 应用中的 Google 地图
- sed - 有人可以帮我扩展 sed 以提取所需的数据吗?