gpt4 book ai didi

R:使用许多配对物种和丰度列重新组织数据框

转载 作者:行者123 更新时间:2023-12-02 04:53:04 26 4
gpt4 key购买 nike

我得到了一个生态数据的数据框,其中包含几对配对的物种丰度列,如下所示:

df <- data.frame(site = 1:3,
sp1 = c("A","A","X"), abund1 = c(10,20,30),
sp2 = c("B","B","Y"), abund2 = c(10,20,30),
sp3 = c("C","Y","Z"), abund3 = c(10,20,30))

site sp1 abund1 sp2 abund2 sp3 abund3
1 1 A 10 B 10 C 10
2 2 A 20 B 20 Y 20
3 3 X 30 Y 30 Z 30

(我正在处理的实际数据有 6 对物种和丰度列)

我需要将其转换为位点与物种的格式以进行进一步的分析,如下所示:

    site   A    B    C    X    Y    Z
1 1 10 10 10 0 0 0
2 2 20 20 0 0 20 0
3 3 0 0 0 30 30 30

我唯一能想到的就是首先将其转换为包含“site”、“species”和“abundance”列的3列数据框,然后使用reshape包。为此,我正在考虑使用 for 循环遍历原始数据帧的每一行,将每一行转换为一个新的数据帧,然后使用 rbind 将其全部分组在一起。但它看起来很笨重,我想知道是否有人可以提出更好的方法?

最佳答案

我们可以尝试从 reshape2 进行recast,首先熔化数据框,然后进行广泛的转换。使用 measure.var=c(2,4,6) 识别正确的标签列。 recast 能够通过将 id.varmeasure.var 发送到 melt 然后发送所有内容来组合这两个函数dcast 的其他参数:

library(reshape2)
recast(df, id.var="site",measure.var=c(2,4,6), site~value,value.var="site",fill=0)
# site A B C X Y Z
# 1 1 1 1 1 0 0 0
# 2 2 2 2 0 0 2 0
# 3 3 0 0 0 3 3 3

更新

使用新数据:

s <- stack(df[-1])
newdf <- cbind(site=df[,1],as.data.frame(lapply(split(s, as.numeric(grepl("sp", s$ind))),'[',1)))
dcast(newdf, site~values.1, fill=0, value.var="values")
# site A B C X Y Z
# 1 1 10 10 10 0 0 0
# 2 2 20 20 0 0 20 0
# 3 3 0 0 0 30 30 30

或者甚至:

x1 <- unlist(df[-1][c(T,F)], use.names=F)
x2 <- unlist(df[-1][c(F,T)], use.names=F)
df2 <- cbind.data.frame(site=df$site,x1,x2)
dcast(df2, site~x1, fill=0, value.var="x2")

这也应该有效:

m1 <- melt(df, id.var="site", measure.var=c(2,4,6))
m2 <- melt(df, id.var="site", measure.var=c(3,5,7))
m3 <- merge(m1, m2, by=1)[c(T,F)]
dcast(m3[!duplicated(m3[1:2]),], site~value.x, fill=0, value.var="value.y")

关于R:使用许多配对物种和丰度列重新组织数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35324746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com