我有一个相对较大的生态网络数据集(植物x动物相互作用)。最终,我想将数据集按一个因素(例如,站点)分成一系列列表,并在每个迷你网络上运行分析。例如,数据如下所示:
site<-c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C")
animal<-c("bee", "bee", "fly", "bird", "bee", "fly", "fly", "fly", "bird", "bird", "bee", "fly")
plant<-c("red", "red", "blue", "blue", "blue", "purple", "green", "yellow", "blue", "blue", "red", "yellow")
interactions<-c(4, 9, 5, 7, 2, 3, 5, 5, 10, 9, 2, 12)
df<-data.frame(site, animal, plant, interactions)
我首先将data.frame按“站点”划分为一系列列表,这是我使用split()完成的。
dl<-split(df, df$site)
然后,我将这些列表中的每一个转换为一个矩阵,其中植物和动物作为行和列,矩阵的内容作为每种植物和动物之间相互作用的总和。我使用lapply()和xtabs()实现了这一点:
ml<-lapply(dl, function(x) xtabs(x$interactions ~ x$animal + x$plant))
But...when --我这样做,整个data.frame中的每一种植物和动物都包含在每个单独的矩阵中,这是我不想要的,原因很多。这一点在看str(毫升)时是很清楚的。我尝试过使用lapply()和factor()删除每个单独矩阵中未使用的动植物,但这没有起作用。
我如何有效地将列表中每个站点中的data.frame转换成一个只有植物和动物存在于该站点的矩阵?例如,我希望站点"A“矩阵看起来如下:
plant
animal blue red
bee 0 13
bird 7 0
fly 5 0
发布于 2015-09-14 13:18:47
我们可以使用droplevels
删除未使用的级别。
ml <- lapply(dl, function(x) xtabs(interactions~animal+plant, droplevels(x)))
ml[[1]]
# plant
#animal blue red
# bee 0 13
# bird 7 0
# fly 5 0
https://stackoverflow.com/questions/32565828
复制相似问题