如何将类别分配给R中的列,以便这些类别中的值可以为每行求和?

krugob8w  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(126)

我在R中有一个数据框架,它是由行中的取样树和列中的不同地衣种类组织起来的。每一列中列出了每棵树上每种地衣种类的计数数据。
| 树ID|地衣_A|地衣_B|苔藓_C|
| --------------|--------------|--------------|--------------|
| 树1|1|第二章|三|
| Tree2|第二章|五|七|
我想对地衣进行分类,并根据类别计算每棵树的数量。理想情况下,这些类别可以从另一个数据框架导入,如下图所示。某些地衣将共享同一个类别。
| 地衣|灵敏度|
| --------------|--------------|
| 地衣_A|低|
| 地衣_B|低|
| 苔藓_C|中等|
组合这些以获得类别的总和如下所示:
| 树ID|低|中等|
| --------------|--------------|--------------|
| 树1|三|三|
| Tree2|七|七|
事实上,我有大约40种不同的地衣,两个敏感性类别和多个树木数据集,所以我想找到一个解决方案,这意味着我不需要手动做每件事。
我不知道如何设置代码,虽然我有一种感觉,这应该是可能的,也许与一个循环和/或dplyr突变?

c9qzyr3d

c9qzyr3d1#

使用dplyrtidyr

library(dplyr)
library(tidyr)
df1 %>% 
  pivot_longer(unique(df2$Lichen)) %>% 
  inner_join(df2, by = c("name" = "Lichen")) %>% 
  group_by(Tree_ID, Sensitivity) %>% 
  summarise(value = sum(value)) %>% 
  pivot_wider(names_from = "Sensitivity")

  Tree_ID   Low Medium
1 Tree1       3      3
2 Tree2       7      7

资料

df1 <- read.table(header = T,text = "Tree_ID    Lichen_A    Lichen_B    Lichen_C
Tree1   1   2   3
Tree2   2   5   7")

df2 <- read.table(header = T,text= "
Lichen  Sensitivity
Lichen_A    Low
Lichen_B    Low
Lichen_C    Medium")
cedebl8k

cedebl8k2#

只需很小的努力,您就可以将sapplyunique灵敏度转换为子集dat,并获得rowSums,我们将cbind转换为第一列。

cbind(dat[1], sapply(unique(ctgr$Sensitivity), \(x) {
  rowSums(dat[names(dat) %in% ctgr$Lichen[ctgr$Sensitivity == x]])
}))
#   Tree_ID Low Medium
# 1   Tree1   3      3
# 2   Tree2   7      7
  • 数据:*
dat <- structure(list(Tree_ID = c("Tree1", "Tree2"), Lichen_A = 1:2, 
    Lichen_B = c(2L, 5L), Lichen_C = c(3L, 7L)), class = "data.frame", row.names = c(NA, 
-2L))

ctgr <- read.table(text='Lichen     Sensitivity
Lichen_A    Low
Lichen_B    Low
Lichen_C    Medium', header=TRUE)
h43kikqp

h43kikqp3#

使用data.table

library(data.table)
dcast(melt(setDT(df1), id.var = "Tree_ID", variable.name = "Lichen")[df2, 
 on = .(Lichen)], Tree_ID ~ Sensitivity, value.var = "value", sum)
  • 输出
Tree_ID Low Medium
1:   Tree1   3      3
2:   Tree2   7      7

相关问题