使用转置从宽到长重塑数据 table

Reshape data table from wide to long with transpose

我有一个数据集(Sample_pH):

Head(Sample_pH)

Mill   Acid `1_day`          `3_days` `1_week` `2_weeks` `4_weeks` `2_months` `3_months` `6-7_months`
  <chr> <dbl> <chr>               <dbl>    <dbl>     <dbl>     <dbl>      <dbl>      <dbl> <chr>       
1 Gävle  0    10.5                12.0     10.9      10.7      10.6       10.1       10    9.81        
2 Gävle  0.5  8.7899999999999~    10        9.29      9.08      9.39       9.13       9.14 8.86        
3 Gävle  0.75 8.0500000000000~     8.95     8.33      8.26      8.24       8.22       8.25 7.44        
4 Gävle  1    6.7                  7.82     7.77      8.02      8.19       7.79       7.97 6.99        
5 Gävle  1.25 6.52                 7.43     7.33      7.11      7.72       7.88       7.91 6.96        
6 Gävle  1.5  6.41                 7.25     7.28      6.92      7.63       7.01       7.64 6.7   

Mill 列实际上有 338 行和几个不同的样品名称(Gävle、Obbola、Aspa 等)。我使用 tis 数据集制作 fawcet_wraped 图:

我想重塑此数据集,以便在绘图中每个面板都是 Mill 而不是 time_stamp,时间戳是绘制的组而不是 Mill,同时保持 x 和 y 不变.为了做到这一点,我必须重塑数据集,但根据我的理解,我已经将宽格式转置并更改为长格式,得到如下内容:

Acid    Time        Gävle   Obbola  Munksund            
0       1_day       10.5    13      15.3
0.5     1_day       8.79    11.03   12.82
0.75    1_day       8.05    10.59   12.27
1       1_day       6.7     9.72    11.6
1.25    1_day       6.52    9.06    10.41
1.5     1_day       6.41    8.01    10.3
1.75    1_day       6.24    8.48    5.78
2       1_day       6.37    8.49    9.94
2.25    1_day       5.08    8.03    7.13

我尝试使用 melt(来自 reshape2 和 data.table)但是由于 patterns 调用无法被我的版本识别,尽管我认为我必须重新加载这两个库使用 reshape。我看过其他几个例子,但 none 似乎有我遇到的转置问题,我似乎无法自己解决。请帮忙?

编辑: 按要求: dput(Sample_pH): https://docs.google.com/document/d/1AfJWPL1GjzAskRKzXWr8MDEvlHBrY-SxjKDZ7LY7lNY/edit?usp=sharing

以及我用来制作图表的 ggplot 代码:

ggplot(gather(Sample_pH, key=Time, value="value", -"Mill", -"Acid"),
          aes(x=Acid, y=as.numeric(value), colour=Mill, group=Mill) )  +
              geom_line() +
               scale_color_ucscgb() +
              facet_wrap(~ Time, scales = 'free', ncol =4) +
               ylab("pH") +
              xlab("ml 12.1 M HCl") +
              theme(plot.title = element_text(hjust = 0.5),
                    legend.title = element_blank())

更好的方法是使用 tidyr 包中的新 pivot_londer 和 pivot_wider 函数。

更易于使用的约定,并具有方便的内置文本操作选项。在这种情况下,删除“X”。已添加到列名称中。

df <- read.table(header=TRUE, text="Mill   Acid `1_day`  `3_days` `1_week` `2_weeks` `4_weeks` `2_months` `3_months` `6-7_months`
Gävle  0    10.5      12.0     10.9      10.7      10.6       10.1       10    9.81        
Gävle  0.5  8.79    10        9.29      9.08      9.39       9.13       9.14 8.86        
Gävle  0.75 8.05     8.95     8.33      8.26      8.24       8.22       8.25 7.44        
Gävle  1    6.7       7.82     7.77      8.02      8.19       7.79       7.97 6.99        
Gävle  1.25 6.52     7.43     7.33      7.11      7.72       7.88       7.91 6.96        
Gävle  1.5  6.41     7.25     7.28      6.92      7.63       7.01       7.64 6.7   
Obbola  0    10.5    12.0     10.9      10.7      10.6       10.1       10    9.81        
Obbola  0.5  8.79    10        9.29      9.08      9.39       9.13       9.14 8.86        
Obbola  0.75 8.05     8.95     8.33      8.26      8.24       8.22       8.25 7.44        
Obbola  1    6.7     7.82     7.77      8.02      8.19       7.79       7.97 6.99        
Obbola  1.25 6.52   7.43     7.33      7.11      7.72       7.88       7.91 6.96        
Obbola  1.5  6.41   7.25     7.28      6.92      7.63       7.01       7.64 6.7   ")

library(tidyr)

longdf <- df %>% pivot_longer(-c("Mill", "Acid"), names_to="Time", values_to = "value", names_prefix="X.")

answer <-longdf %>% pivot_wider(id_cols= c("Time", "Acid" ), names_from = "Mill" )