Конвертировать столбцы в строки и переставить таблицу в R - PullRequest
1 голос
/ 23 апреля 2020

В настоящее время у меня есть таблица, которая выглядит следующим образом:

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))

Спасибо !!

Отредактировано, чтобы показать больше реалистичности c таблица

1 Ответ

1 голос
/ 23 апреля 2020

Мы можем 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
...