首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将data.frame按因子分解为列表,然后将列表转换为带有xtabs的矩阵,并删除所有未使用的级别?

将data.frame按因子分解为列表,然后将列表转换为带有xtabs的矩阵,并删除所有未使用的级别?
EN

Stack Overflow用户
提问于 2015-09-14 13:15:52
回答 1查看 203关注 0票数 1

我有一个相对较大的生态网络数据集(植物x动物相互作用)。最终,我想将数据集按一个因素(例如,站点)分成一系列列表,并在每个迷你网络上运行分析。例如,数据如下所示:

代码语言:javascript
运行
复制
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()完成的。

代码语言:javascript
运行
复制
dl<-split(df, df$site)

然后,我将这些列表中的每一个转换为一个矩阵,其中植物和动物作为行和列,矩阵的内容作为每种植物和动物之间相互作用的总和。我使用lapply()和xtabs()实现了这一点:

代码语言:javascript
运行
复制
ml<-lapply(dl, function(x) xtabs(x$interactions ~ x$animal + x$plant))

But...when --我这样做,整个data.frame中的每一种植物和动物都包含在每个单独的矩阵中,这是我不想要的,原因很多。这一点在看str(毫升)时是很清楚的。我尝试过使用lapply()和factor()删除每个单独矩阵中未使用的动植物,但这没有起作用。

我如何有效地将列表中每个站点中的data.frame转换成一个只有植物和动物存在于该站点的矩阵?例如,我希望站点"A“矩阵看起来如下:

代码语言:javascript
运行
复制
          plant
  animal  blue  red 
    bee     0    13
    bird    7     0 
    fly     5     0 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-14 13:18:47

我们可以使用droplevels删除未使用的级别。

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32565828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档