将数据框重塑为宽格式以进行 GLM 分析

Reshape dataframe to wide format for GLM analysis

我有一个包含地块、物种和出现数据的 3 列数据框。当我使用 str() 时,我得到以下输出:

> str(AbundTGLMSOagg)
'data.frame':   1148 obs. of  3 variables:
 $ plot      : Factor w/ 139 levels "H01","H02","H03",..: 1 1 1 1 1 1 1 1 1 2 ...
 $ species   : Factor w/ 62 levels "albleb","albodo",..: 26 42 46 47 48 50 52 53 62 20 ...
 $ occurrence: int  1 1 1 14 1 10 10 1 1 1 ...

但是,我想将其转换为具有 62 个变量(= 62 个物种)的 139 个 obs(= 139 个图)的数据框,以便每个物种在 str() 输出中都是“$ species name”。

str() 输出应类似于此处的示例:

> str(antTraits$abund)
'data.frame':   30 obs. of  41 variables:
 $ Amblyopone.australis         : int  0 0 0 4 2 0 0 0 1 0 ...
 $ Aphaenogaster.longiceps      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Camponotus.cinereus.amperei  : int  0 0 0 0 0 1 0 0 0 0 ...
 $ Camponotus.claripes          : int  2 0 0 1 4 5 6 4 1 2 ...
 $ Camponotus.consobrinus       : int  1 4 6 1 7 11 9 11 19 17 ...
 $ Camponotus.nigriceps         : int  6 0 0 0 0 0 1 0 0 0 ............ETC

数据框如下所示:

> head(antTraits$abund)

  Amblyopone.australis Aphaenogaster.longiceps Camponotus.cinereus.amperei Camponotus.claripes Camponotus.consobrinus Camponotus.nigriceps Camponotus.nigroaeneus
1                    0                       0                           0                   2                      1                    6                      0
2                    0                       0                           0                   0                      4                    0                      1
3                    0                       0                           0                   0                      6                    0                      0
4                    4                       0                           0                   1                      1                    0                      0
5                    2                       0                           0                   4                      7                    0                      0
6                    0                       0                           1                   5                     11                    0                      6

这是我的数据集:https://pastebin.com/XhArqd5F

> foo
     plot albleb albodo antgha apovil artlak briret buclan cansub carsph catspa cropoi dalcul dallan dalnig daloli dilobo dioehr diomal dipint diptub elltom erican
  1:  H01     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
  2:  H02     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      1     NA     NA
  3:  H03     NA     NA     NA      3     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      3     NA     NA
  4:  H04     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      1     NA     NA
  5:  H05     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      1     NA     NA     NA     NA     NA     NA      1     NA     NA

非常感谢您的任何建议。

使用 data.table 您可以执行以下操作

    library(data.table)
    dat = setDT(AbundTGLMSOagg)
str(dat)
Classes ‘data.table’ and 'data.frame':  8618 obs. of  3 variables:
 $ plot: Factor w/ 139 levels "H01","H02","H03",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ species: Factor w/ 62 levels "albleb","albodo",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ occurrence: int  0 0 0 0 0 0 0 0 0 1 ...

只需将您的数据转换为宽格式:

    foo = dcast.data.table(dat, plot ~ species)
str(foo)
Classes ‘data.table’ and 'data.frame':  139 obs. of  63 variables:
 $ Var1  : Factor w/ 139 levels "H01","H02","H03",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ albleb: int  0 0 0 0 0 0 0 0 0 1 ...
 $ albodo: int  0 0 0 0 0 0 0 0 0 0 ...
 $ antgha: int  0 0 0 0 0 0 0 0 0 0 ...
 $ apovil: int  0 0 3 0 0 3 1 0 0 0 ...
 $ artlak: int  0 0 0 0 0 0 0 0 0 0 ...
 $ briret: int  0 0 0 0 0 0 0 0 0 1 ...