我有一组来自三维数据的计数:
df <- data.frame(type = c("A", "B", "B", "A", "A", "C", "B", "C"), group = c("Tp", "Tp", "Tp", "Tp", "Fc", "Fc", "Fc", "Fc"), size = c(10,20,30,40,10,20,30,40), count = c(1, 4, 2, 3, 2, 10, 2, 3))
type group size count
1 A Tp 10 1
2 B Tp 20 4
3 B Tp 30 2
4 A Tp 40 3
5 A Fc 10 2
6 C Fc 20 10
7 B Fc 30 2
8 C Fc 40 3
我想找到每个计数占用的比例,但是在类型和组维度上都是子集。也就是说,例如,在“Tp”组和“A”类中,大小为10的距离是什么?
我认为可能有一个函数类似于aggregate
或plyr
包中的某些内容,但会根据子集计算每行的数据,但我似乎无法找到它。我尽最大努力使用apply:
df$prop <- apply(df, 1, function(x) as.numeric(x["count"])/sum(df[df$type==x["type"] & df$group==x["group"], "count"]))
type group size count prop
1 A Tp 10 1 0.2500000
2 B Tp 20 4 0.6666667
3 B Tp 30 2 0.3333333
4 A Tp 40 3 0.7500000
5 A Fc 10 2 1.0000000
6 C Fc 20 10 0.7692308
7 B Fc 30 2 1.0000000
8 C Fc 40 3 0.2307692
我只是想知道是否有更简单的方法吗?如果不是,我会把它写成自定义函数。
感谢。
答案 0 :(得分:2)
尝试:
transform(df, prop=count/ave(count, type, group, FUN=sum))
答案 1 :(得分:1)
使用plyr,
ddply(df, c("type","group"), mutate, prop = count/sum(count))
type group size count prop
1 A Fc 10 2 1.0000000
2 A Tp 10 1 0.2500000
3 A Tp 40 3 0.7500000
4 B Fc 30 2 1.0000000
5 B Tp 20 4 0.6666667
6 B Tp 30 2 0.3333333
7 C Fc 20 10 0.7692308
8 C Fc 40 3 0.2307692
答案 2 :(得分:0)
更好的缩放和更直观的data.table
方式:
library(data.table)
dt = data.table(df)
dt[, prop := count/sum(count), by = list(type, group)]