从列中获取一些值以使多个新列与 R 中的 id 列匹配

taking some values from a column to make multiple new columns matched by an id column in R

我在R中有两个数据框:

df1

    Site_code  Species_code  Abundance
    1           MRN          50
    1           TFP          100
    2           MRN          5
    2           XNP          20
    2           AMP          15

在 df2 中我有一堆信息,还有网站代码,但每个网站只有一行。其他列不感兴趣。

    Site_code   latitude   mean_temp ...etc
    1               55          15
    2               56          10 

我想创建一个新的数据框(或矩阵),基于 df1 中的信息,df2 中的每个站点一行,每个物种一列,列名与物种代码相同,以及列中每个物种丰度的信息,如果该物种未在该站点记录,则值为 0,这样我会得到一个像这样的 df:

    Site_code   AMP  MRN    TFP   XNP
    1           0     50     100  0  
    2           15    5      0    20

我也想做几次,因为我有很多 df2,我想为每个 df2 组成一个新的数据框。

我已经阅读了很多关于 SO 的问题,但还没有遇到可以回答这个问题的问题。如果已经得到解答,我将非常感激被指出正确的方向。

R 有几个用于将数据从长格式重塑为宽格式的函数,包括预安装的 stats 包中的 reshapereshape2 包中的 dcast。在我看来,tidyr 包中的 spread 具有最直观的语法:

library(tidyr)
spread(df1, Species_code, Abundance, fill = 0)

数据

df1 <- read.table(text = 
"Site_code  Species_code  Abundance
    1           MRN          50
    1           TFP          100
    2           MRN          5
    2           XNP          20
    2           AMP          15",
header = TRUE)

您可以使用 reshape2 中的 dcast 函数:

library(reshape2)
df2 <- dcast(df1, Site_code ~ Species_code, fill = 0)

df2
# Site_code AMP MRN TFP XNP
#         1   0  50 100   0
#         2  15   5   0  20

简短。

您也可以使用 stats 包中的 reshape,它不需要外部库。

# Transpose the data frame by site
df2 <- reshape(df1,
               idvar = "Site_code",
               timevar = "Species_code",
               direction = "wide")

# Reset NA values to 0
df2[is.na(df2)] <- 0

# Remove "Abundance." from the column names
colnames(df2) <- gsub("Abundance.", "", colnames(df2))

df2
# Site_code MRN TFP XNP AMP
#         1  50 100   0   0
#         2   5   0  20  15

reshape 函数用 NA 填充原始未转置数据集中不存在的值,因此必须手动将这些值重置为 0。

它还将转置变量的名称附加到新的列名称,但可以使用 gsub.

将其删除