作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到了一个生态数据的数据框,其中包含几对配对的物种丰度列,如下所示:
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.var
和 measure.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/
我是一名优秀的程序员,十分优秀!