如何计算组的倍数变化?

时间:2019-07-20 11:49:48

标签: r

我有数据框,想计算两组平均值的倍数变化,例如:df1

value group
  5     A
  2     B
  4     A
  4     B
  3     A
  6     A
  7     B
  8     A

结果应为“平均值(5 + 4 + 3 + 6 + 8)/平均值(2 + 4 + 7)= 1.2”

我如何实现我的目标?

4 个答案:

答案 0 :(得分:1)

我假设您有一个具有3个值的数据框,如下所示:

df=data.frame(group=rep(c("A","B"),5),
              value1=1:10,value2=21:30,value3=41:50,stringsAsFactors = F)
> df
   group value1 value2 value3
1      A      1     21     41
2      B      2     22     42
3      A      3     23     43
4      B      4     24     44
5      A      5     25     45
6      B      6     26     46
7      A      7     27     47
8      B      8     28     48
9      A      9     29     49
10     B     10     30     50

您应该使用s tringsAsFactors = F来创建或读取数据。那么您可以使用以下代码计算倍数变化:

res=aggregate(.~group,df,mean)
res["fc",]=c("A.vs.B",as.numeric(res[1,-1])/as.numeric(res[2,-1]))

    group            value1            value2            value3
1       A                 5                25                45
2       B                 6                26                46
fc   A.vs.B             0.83             0.961             0.9782

我的建议:使用软件包limma为大数据计算倍数变化和统计分析。

答案 1 :(得分:1)

根据您的期望,可以使用该功能(summean

我们可以使用tapply

x <- tapply(df$value, df$group, mean)
x[1]/x[2]
# A 
#1.2 

x <- tapply(df$value, df$group, sum)
x[1]/x[2]
#A 
#2 

我们也可以通过相同的逻辑对splitsapply使用相同的东西

x <- sapply(split(df$value, df$group), mean)
x[1]/x[2]

x <- sapply(split(df$value, df$group), sum)
x[1]/x[2]

答案 2 :(得分:0)

我们可以使用tidyverse方法

library(dplyr)
df %>%
    group_by(group) %>%
    summarise(value = mean(value)) %>%
    summarise(value = first(value)/last(value))
# A tibble: 1 x 1
#  value
#  <dbl>
#1   1.2

或使用by中的base R

by(df[,'value'], df['group'], mean)
by(df[,'value'], df['group'], sum)

数据

df <-structure(list(value = c(5L, 2L, 4L, 4L, 3L, 6L, 7L, 8L), group = c("A", 
"B", "A", "B", "A", "A", "B", "A")), class = "data.frame", row.names = c(NA, 
-8L))

答案 3 :(得分:0)

我相信最简单的方法是像在@Ronak的answer中一样使用tapply,然后用Reduce执行除法。

tapply(df1$value, df1$group, sum)
# A  B 
#26 13 

Reduce(`/`, tapply(df1$value, df1$group, sum))
#[1] 2

数据。

df1 <- read.table(text = "
value group
  5     A
  2     B
  4     A
  4     B
  3     A
  6     A
  7     B
  8     A
", header = TRUE)