从列中获取一些值以使多个新列与 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
包中的 reshape
和 reshape2
包中的 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
.
将其删除
我在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
包中的 reshape
和 reshape2
包中的 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
.