在R中把列转换成行并重新排列表格

问题描述 投票:0回答:1

我目前的表是这样的。

table <- data.frame("Season" = c("Winter", "Winter", "Winter", "Winter", "Winter", "Winter",
                             "Summer", "Summer", "Summer", "Summer", "Summer", "Summer"),
                "Site" = c(123,123,123,123,123,123,123,123,123,123,123,123),
                "Flow" = c("H001", "H007", "H030", "L001", "L007", "L030",
                           "H001", "H007", "H030", "L001", "L007", "L030"),
                "X0.5" = c(100,200,300,400,500,600,700,800,900,1000,1100,1200),
                "X0.2" =c(1,2,3,4,5,6,7,8,9,10,11,12),
                "X0.1" = c(12,11,10,9,8,7,6,5,4,3,2,1),
                "X0.05" = c(10, 11, 12, 1,2,3,4,5,6,7,8,9),
                "X0.04" = c(2,4,6,8,10,12,14,16,10, 10, 10, 10))

而这是我最后想要的表格(但要有正确的对应值,而不是所有的0)。

table2 <- data.frame("Site" = c(123, 123, 123, 123, 123), "Recurrence_Interval" = c(0.5, 0.2, 0.1, 0.05, 0.04), 
                 "H001_Winter" = c(0,0,0,0,0), "H007_Winter" = c(0,0,0,0,0), "H030_Winter" = c(0,0,0,0,0),
                 "L001_Winter" = c(0,0,0,0,0), "L007_Winter" = c(0,0,0,0,0), "L030_Winter" = c(0,0,0,0,0),
                 "H001_Summer" = c(0,0,0,0,0), "H007_Summer" = c(0,0,0,0,0), "H030_Summer" = c(0,0,0,0,0),
                 "L001_Summer" = c(0,0,0,0,0), "L007_Summer" = c(0,0,0,0,0), "L030_Summer" = c(0,0,0,0,0))

经过编辑,可以看到更真实的表格

r transpose melt
1个回答
1
投票

我们可以 unite 的两栏,然后用 pivot_wider

library(dplyr)
library(tidyr)
library(data.table)
table %>% 
   unite(Season_Flow, Flow, Season, sep="_") %>% 
   pivot_longer(cols = starts_with('X0'), names_to = 'Recurrence_Interval') %>%
   mutate(rn = rowid(Season_Flow, Site), 
     Recurrence_Interval = readr::parse_number(Recurrence_Interval)) %>%
   pivot_wider(names_from = Season_Flow, values_from = value)

更新

根据上文中提供的不同数据,我们可以做到

library(readxl)
df1 <- read_excel(file.choose())
df1 %>% 
   unite(Season_Flow, Flow, Season, sep="_") %>%
   pivot_longer(cols = matches("^[0-9]"),  names_to = 'Recurrence_Interval') %>%
   type.convert %>% 
   select(-Method, -Name, -n, -Regulated, -`KS Test`) %>%
   mutate(rn = rowid(Season_Flow, Site_No)) %>%
   pivot_wider(names_from = Season_Flow, values_from = value) %>% 
   as.data.frame
#  Site_No Recurrence_Interval rn H001_Annual H007_Annual H030_Annual L007_Annual L030_Annual L001_Annual L007_Winter H001_Winter
#1     123                0.50  1       525.5     202.215    108.9350    15.68600    21.32300     13.3000     23.1290       441.0
#2     123                0.20  2       782.2     320.972    159.0300    11.24960    15.67940      9.1040     16.6856       623.2
#3     123                0.10  3      1014.0     390.086    195.7190     9.27142    11.85660      7.8200     12.4340       699.2
#4     123                0.05  4      1108.5     458.186    214.7105     7.90284     9.43433      6.1300     11.2001      1072.0
#5     123                0.04  5      1394.1     489.760    218.5800     7.87730    10.26500      2.9589     10.2370      1050.2
#  H007_Winter H030_Winter L030_Winter L001_Winter
#1     171.270     102.120     29.9000     20.0000
#2     247.772     135.232     22.9466     13.4000
#3     315.088     159.790     18.3064     11.0000
#4     379.704     193.658     13.7830      8.2880
#5     381.810     192.770     14.1070      4.6929
© www.soinside.com 2019 - 2024. All rights reserved.