将R中的数据框转换为其他格式

Transforming dataframe in R to other format

我正在努力解决一个问题。 我有一个数据集,其中包含每年和每个地点分组的物种及其丰度。 有三年七地。数据现在看起来像这样(示例):

Year   Site    Spec   Abundance
2010   1       INHET  12 
2012   1       INHET  45
2016   1       INHET  2
2010   2       INLEP  6 
2012   2       INLEP  15
2016   2       INLEP  18

我希望它看起来像这样:

Year   Site   INHET   INLEP
2010   1      12      0
2010   2      0       6
2012   1      45      0
2012   2      0       15
2016   1      2       0
2016   2      0       18

我一直在尝试各种各样的事情,但无法弄清楚如何将数据集转换为所需的格式。我不想使用 excel 来做到这一点。

数据集:

structure(list(Jaar = c(2010L, 2012L, 2016L, 2012L, 2010L, 2012L, 
2016L, 2010L, 2012L, 2012L, 2010L, 2012L, 2016L, 2010L, 2012L, 
2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 
2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 
2016L, 2010L, 2012L, 2016L, 2012L, 2016L, 2010L, 2010L, 2010L, 
2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 
2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 
2012L, 2016L, 2012L, 2012L, 2010L, 2012L, 2016L, 2010L, 2016L, 
2010L, 2012L, 2016L, 2010L, 2012L, 2012L, 2012L, 2010L, 2012L, 
2016L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 
2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2010L, 
2012L, 2016L, 2010L, 2012L, 2012L, 2010L, 2012L, 2016L, 2010L, 
2012L, 2012L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 
2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 
2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2012L, 
2016L, 2012L, 2016L, 2012L, 2016L, 2010L, 2012L, 2016L, 2012L, 
2016L, 2010L, 2012L, 2010L, 2012L, 2010L, 2012L, 2016L, 2010L, 
2012L, 2016L, 2010L, 2012L, 2010L, 2010L, 2012L, 2016L, 2010L, 
2012L, 2012L, 2016L, 2010L, 2012L, 2016L, 2016L, 2010L, 2012L, 
2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2016L, 
2010L, 2012L, 2016L, 2016L, 2010L, 2012L, 2016L, 2010L, 2016L, 
2010L, 2012L, 2010L, 2012L, 2010L, 2012L, 2012L, 2012L, 2016L, 
2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 
2010L, 2012L, 2010L, 2012L, 2012L, 2016L, 2010L, 2012L, 2010L, 
2010L, 2016L, 2010L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 
2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 
2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2012L, 2016L, 2016L, 
2010L, 2012L, 2010L, 2012L, 2016L, 2010L, 2012L, 2016L, 2010L, 
2012L, 2016L, 2010L, 2012L, 2010L, 2012L, 2016L, 2010L, 2012L, 
2016L), Meetobject_Code = structure(c(1L, 1L, 1L, 2L, 3L, 3L, 
3L, 4L, 4L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 
3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 
2L, 6L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 
5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 6L, 7L, 1L, 1L, 1L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 5L, 6L, 7L, 7L, 7L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 
3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 2L, 3L, 
3L, 3L, 4L, 4L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 
4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 3L, 
3L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 7L, 7L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 5L, 6L, 6L, 6L, 7L, 7L, 1L, 1L, 2L, 2L, 2L, 3L, 
4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 1L, 1L, 1L, 2L, 3L, 
3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 
3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 2L, 3L, 4L, 5L, 
5L, 6L, 7L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 
5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 3L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L), .Label = c("KRW11_01", 
"KRW11_02", "KRW11_03", "KRW11_05", "KRW11_06", "KRW11_07", "KRW11_10"
), class = "factor"), GROUP = structure(c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L, 
14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 15L, 
16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 
16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 18L, 18L, 
18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 
18L, 18L, 18L, 18L, 18L, 19L, 19L, 19L, 20L, 20L, 20L, 20L, 20L, 
20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 
20L), .Label = c("APHIR", "APOLI", "APTUR", "ARACH", "COLMB", 
"CRAMP", "CRISO", "CRMYS", "CRREM", "IDCHI", "IDREM", "INCOL", 
"INEPH", "INHET", "INLEP", "INODO", "INREM", "INTRI", "MOBIV", 
"MOGAS"), class = "factor"), `as.integer(Waarde_Berekend)` = c(1L, 
436L, 138L, 1L, 39L, 39L, 2L, 40L, 1L, 38L, 39L, 2L, 1L, 95L, 
93L, 39L, 115L, 33L, 334L, 197L, 146L, 13L, 1L, 1L, 278L, 35L, 
95L, 83L, 192L, 55L, 59L, 4L, 38L, 144L, 2L, 55L, 15L, 102L, 
1L, 39L, 64L, 40L, 633L, 5L, 182L, 418L, 295L, 43L, 152L, 41L, 
587L, 271L, 319L, 282L, 339L, 117L, 291L, 550L, 130L, 41L, 122L, 
83L, 1L, 1L, 38L, 177L, 55L, 55L, 38L, 33L, 39L, 58L, 81L, 108L, 
93L, 55L, 125L, 196L, 76L, 27L, 130L, 2L, 144L, 49L, 65L, 2L, 
81L, 197L, 43L, 67L, 5L, 39L, 1L, 177L, 86L, 161L, 174L, 1L, 
76L, 22L, 38L, 37L, 39L, 64L, 81L, 55L, 1L, 290L, 267L, 289L, 
614L, 411L, 163L, 1L, 290L, 367L, 203L, 299L, 250L, 418L, 148L, 
91L, 244L, 253L, 231L, 281L, 329L, 100L, 114L, 39L, 25L, 2L, 
55L, 1L, 38L, 55L, 1L, 71L, 49L, 1L, 55L, 38L, 1L, 66L, 55L, 
254L, 2L, 2L, 91L, 88L, 1L, 1L, 162L, 38L, 77L, 39L, 116L, 1L, 
4L, 39L, 261L, 145L, 106L, 84L, 39L, 54L, 55L, 65L, 172L, 2L, 
174L, 126L, 82L, 263L, 86L, 1L, 52L, 39L, 271L, 235L, 56L, 66L, 
38L, 153L, 2L, 1L, 1L, 41L, 1L, 40L, 1L, 3L, 38L, 90L, 78L, 2L, 
1L, 60L, 1L, 2L, 12L, 82L, 78L, 38L, 1L, 2L, 76L, 102L, 134L, 
2L, 1L, 1L, 70L, 1L, 1L, 38L, 55L, 298L, 5L, 223L, 464L, 140L, 
1L, 182L, 1L, 70L, 302L, 237L, 120L, 42L, 252L, 210L, 70L, 105L, 
112L, 2L, 187L, 1L, 56L, 77L, 66L, 1032L, 96L, 113L, 122L, 495L, 
2L, 1L, 408L, 42L, 3L, 105L, 29L, 302L, 210L, 57L, 588L, 258L, 
143L)), row.names = c(NA, -259L), class = "data.frame")

正如@duckmayr 所建议的,pivot_wider 适合于此。

基于您的示例数据(调用数据框df):

library(tidyr)

pivot_wider(df, id_cols = c(Jaar, Meetobject_Code), names_from = GROUP, values_from = Waarde_Berekend)

输出

# A tibble: 21 x 22
    Jaar Meetobject_Code APHIR APOLI APTUR ARACH COLMB CRAMP CRISO CRMYS CRREM IDCHI IDREM INCOL INEPH INHET INLEP INODO INREM INTRI MOBIV MOGAS
   <int> <fct>           <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1  2010 KRW11_01            1   115    NA    40    NA    38    NA    76    NA   290   114    55    NA    39    NA    NA    NA    NA    NA    66
 2  2012 KRW11_01          436    33   102   633    NA   177    27    22    NA   267    39   254   261   271    38    90    NA   298     1  1032
 3  2016 KRW11_01          138   334    NA     5    NA    55   130    NA    NA   289    25    NA   145   235    NA    78    NA     5    56    NA
 4  2012 KRW11_02            1   146    NA   418    NA    NA   144    38    NA   411     2     2    84    NA    NA     1    NA   464    NA   113
 5  2010 KRW11_03           39     1    NA    43    NA    33    65    37    NA     1    NA    88    NA    66    NA     1    NA     1    NA   495
 6  2012 KRW11_03           39     1    NA   152    NA    39     2    39     1   290     1     1    NA    38    NA     2     1   182    NA     2
 7  2016 KRW11_03            2   278    NA    41    NA    58    81    64    NA   367    38     1    54   153    NA    12    NA     1    77     1
 8  2010 KRW11_05           40    35    NA   587    NA    81   197    81    NA   203    NA   162    55     2    NA    82    70    70    NA   408
 9  2012 KRW11_05            1    95    NA   271    NA   108    43    55    NA   299    55    38    65    NA    NA    78    NA   302    NA    42
10  2012 KRW11_06           38    55    NA   339    NA    93    39    NA    NA   148    49    NA   174    41    NA     2    NA    42    NA    29
# … with 11 more rows

注意:使用列名 Waarde_Berekend 而不是 as.integer(Waarde_Berekend)

使用您提供的数据集(我将其命名为 df):

我重命名了您的第四列 n 以便更容易操作。在 pivot_wider 中,您提供要扩展为宽格式的列 "names_from",然后提供 "values_from" 的值,最后,要填充 0 而不是 NA,请执行 values_fill(list(n=0)) 因为第四列被称为 'n':

library(tidyr)
colnames(df)[4]="n"
df %>% 
pivot_wider(names_from="Meetobject_Code",
values_from="n",values_fill = list(n=0)) %>%
arrange(GROUP,Jaar) %>% head(10)

# A tibble: 6 x 9
   Jaar GROUP KRW11_01 KRW11_02 KRW11_03 KRW11_05 KRW11_06 KRW11_07 KRW11_10
  <int> <fct>    <int>    <int>    <int>    <int>    <int>    <int>    <int>
1  2010 APHIR        1        0       39       40        0       39       95
2  2012 APHIR      436        1       39        1       38        2       93
3  2016 APHIR      138        0        2        0        0        1       39
4  2010 APOLI      115      197        1       35      192        4        2
5  2012 APOLI       33      146        1       95       55       38       55
6  2016 APOLI      334       13      278       83       59      144       15

使用你的小例子:

从您的小示例中输入数据

df = data.frame(Year = c(2010, 2012, 2016, 2010, 2012, 2016), 
                Site = c(1,1,1,2,2,2), 
                Spec = c('INHET', 'INHET', 'INHET', 'INLEP', 'INLEP', 'INLEP'),
                Abundance = c(12, 45, 2, 6, 15, 18))
print(df, row.names = F)

输出

 Year Site  Spec Abundance
 2010    1 INHET        12
 2012    1 INHET        45
 2016    1 INHET         2
 2010    2 INLEP         6
 2012    2 INLEP        15
 2016    2 INLEP        18

转换该数据

df2 = df %>% 
  pivot_wider( names_from = "Spec",                ## where the column names should come from
              values_from = "Abundance",           ## where the values should come from
              values_fill = list(Abundance=0)) %>% ## what the missing values should be
  arrange(Year) %>%                                ## sort by Year, ascending

print(df2, row.names = F)

输出

 Year Site INHET INLEP
 2010    1    12     0
 2010    2     0     6
 2012    1    45     0
 2012    2     0    15
 2016    1     2     0
 2016    2     0    18