R 中同一列内的成对比较

Pairwise comparisons within the same column in R

提问人:Biomol 提问时间:4/15/2023 最后编辑:Biomol 更新时间:4/15/2023 访问量:41

问:

我有一定的响应变量(生物量),我正在分析从不同论文中检索到的一系列环境条件。

示例数据集:

生物量 条件
小一 10 控制
小一 5 物种1
小一 0 物种1
小二 2 控制
小二 4 物种4
小二 6 物种4
小三 2 控制
小三 2 物种1
小三 8 物种2
小三 6 物种3
小三 7 物种4
小三 2 物种5
小四 3 控制
小四 1 物种6

对于每篇论文,我想专门划分每个物种的生物量结果以进行对照。例如,对于 P1(论文 1),我想将每个物种的生物量结果除以 (/) 用于对照。

示例输出(我在这里使用了随机数值结果):

比较 Biomass_results
小一 对照与物种1 5
小二 对照与物种4 4
小三 对照与物种1 2
小三 对照与物种2 6
小三 对照与物种3 7
小三 对照与物种4 3
小三 对照组与物种5 2
小四 对照与物种6 1

有什么建议吗?

我尝试使用 tidyverse,但没有成功。

R DataFrame Tidyverse 数据操作

评论

0赞 Andre Wildberg 4/15/2023
“划分结果”是什么意思?您能否通过编辑添加预期的输出?
0赞 Biomol 4/15/2023
刚刚编辑。希望现在很清楚。
0赞 GegznaV 4/15/2023
你的结果应该是什么样子的?提供应根据输入创建的答案(数据框)。
0赞 Community 4/15/2023
请澄清您的具体问题或提供其他详细信息,以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。

答:

0赞 Andre Wildberg 4/15/2023 #1

这可能会产生预期的结果。

首先是 Species,然后构造 Comparison 字符串,最后进行除法和最终结果。sumfilter

library(dplyr)

df %>% 
  summarize(Biomass_sum = sum(Biomass), .by = c(Paper, Condition)) %>% 
  mutate(Comparison = paste("Control vs", Condition),
         Biomass_results = Biomass_sum / 
           Biomass_sum[Comparison == "Control vs Control"], .by = Paper) %>% 
  filter(Comparison != "Control vs Control") %>% 
  select(-c(Biomass_sum, Condition))
  Paper          Comparison Biomass_results
1    P1 Control vs Species1       0.5000000
2    P2 Control vs Species4       5.0000000
3    P3 Control vs Species1       1.0000000
4    P3 Control vs Species2       4.0000000
5    P3 Control vs Species3       3.0000000
6    P3 Control vs Species4       3.5000000
7    P3 Control vs Species5       1.0000000
8    P4 Control vs Species6       0.3333333

数据

df <- structure(list(Paper = c("P1", "P1", "P1", "P2", "P2", "P2", 
"P3", "P3", "P3", "P3", "P3", "P3", "P4", "P4"), Biomass = c(10L, 
5L, 0L, 2L, 4L, 6L, 2L, 2L, 8L, 6L, 7L, 2L, 3L, 1L), Condition = c("Control", 
"Species1", "Species1", "Control", "Species4", "Species4", "Control", 
"Species1", "Species2", "Species3", "Species4", "Species5", "Control", 
"Species6")), class = "data.frame", row.names = c(NA, -14L))