簡體   English   中英

重新排列 R 中熱圖的數據框

[英]Rearranging data frame for a Heat map plot in R

我正在嘗試使用 ggpolt 繪制熱圖,為此我想重新排列我的數據框,如下所示:

 country    2012  2013  2014  2015  
   AUS        2    5     6     1    
   AUT        3    3     1     5    
   BEL        1    8     2     8    
   NED        5    3     0     5

進入一個看起來像這樣的日期框架:

country  year  value
  AUS    2012   2
  AUS    2013   5
  AUS    2014   6
  AUS    2015   1
  AUT    2012   3
  AUT    2013   3 
  AUT    2014   1
  AUT    2015   5
  BEL    2012   1
  BEL    2013   8 
  BEL    2014   2 
  BEL    2015   8
  NED    2012   5
  NED    2013   3
  NED    2014   0
  NED    2014   5

即,從具有年份行的數據框到國家、年份和相應值的三列數據框。

謝謝

我們可以使用pivot_longer

library(tidyr)
pivot_longer(df1, cols = -country, names_to = 'year')
#    country year value
#1      AUS 2012     2
#2      AUS 2013     5
#3      AUS 2014     6
#4      AUS 2015     1
#5      AUT 2012     3
#6      AUT 2013     3
#7      AUT 2014     1
#8      AUT 2015     5
#9      BEL 2012     1
#10     BEL 2013     8
#11     BEL 2014     2
#12     BEL 2015     8
#13     NED 2012     5
#14     NED 2013     3
#15     NED 2014     0
#16     NED 2015     5

數據

df1 <- structure(list(country = c("AUS", "AUT", "BEL", "NED"), `2012` = c(2L, 
3L, 1L, 5L), `2013` = c(5L, 3L, 8L, 3L), `2014` = c(6L, 1L, 2L, 
0L), `2015` = c(1L, 5L, 8L, 5L)), class = "data.frame", row.names = c(NA, 
-4L))

使用melt

library(data.table)
setDT(df); melt(df, id.vars = "country", variable.name = "year")

        country year value
 #1:     AUS     2012     2
 #2:     AUT     2012     3
 #3:     BEL     2012     1
 #4:     NED     2012     5
 #5:     AUS     2013     5
 #6:     AUT     2013     3
 #7:     BEL     2013     8
 #8:     NED     2013     3
 #9:     AUS     2014     6
#10:     AUT     2014     1
#11:     BEL     2014     2
#12:     NED     2014     0
#13:     AUS     2015     1
#14:     AUT     2015     5
#15:     BEL     2015     8
#16:     NED     2015     5

數據

df <- structure(list(country = structure(1:4, .Label = c("AUS", "AUT", "BEL", "NED"), class = "factor"), `2012` = c(2L, 3L, 1L, 5L), `2013` = c(5L, 3L, 8L, 3L), `2014` = c(6L, 1L, 2L, 0L), `2015` = c(1L,5L, 8L, 5L)), class = "data.frame", row.names = c(NA, -4L))

一個基本的 R 解決方案是這樣的(重新使用@akrun 的數據):

首先, unlist df1[,2:5]中的值並存儲在向量中:

values <- as.numeric(unlist(df1[,2:5]))

接下來,將國家/地區值和年份值重復適當次數並存儲在向量中:

countries <- rep(df1$country, length(counts)/length(df1$country))
years <- rep(names(df1[,2:5]),length(counts)/length(df1$country))

然后將所有三個向量組合到新的數據框中:

df1_long <-data.frame(countries, years, values)

最后,以df1_long df1_long$countries的(默認)非字母順序排列 df1_long:

df1_long_ord <- df1_long[order(df1_long$countries),]

結果:

df1_long_ord
   countries years values
1        AUS  2012      2
5        AUS  2012      5
9        AUS  2012      6
13       AUS  2012      1
2        AUT  2013      3
6        AUT  2013      3
10       AUT  2013      1
14       AUT  2013      5
3        BEL  2014      1
7        BEL  2014      8
11       BEL  2014      2
15       BEL  2014      8
4        NED  2015      5
8        NED  2015      3
12       NED  2015      0
16       NED  2015      5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM