我有数据框,想计算两组平均值的倍数变化,例如: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”
我如何实现我的目标?
答案 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)
根据您的期望,可以使用该功能(sum
或mean
)
我们可以使用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
我们也可以通过相同的逻辑对split
和sapply
使用相同的东西
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)