考虑这个数据:
m = data.frame(pop=c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4),
id=c(0,1,1,1,1,1,0,2,1,1,1,2,1,2,2,2))
> m
pop id
1 1 0
2 1 1
3 1 1
4 1 1
5 2 1
6 2 1
7 2 0
8 2 2
9 2 1
10 3 1
11 3 1
12 3 2
13 3 1
14 3 2
15 4 2
16 4 2
我想获取每个唯一pop
中每个唯一id
的频率?例如,id 1<当
在 4 次中出现 3 次,因此 pop == 1
时,pop 1
中 id 1
的频率为 0.75。
我想到了这个丑陋的解决方案:
out = matrix(0,ncol=3)
for (p in unique(m$pop))
{
for (i in unique(m$id))
{
m1 = m[m$pop == p,]
f = nrow(m1[m1$id == i,])/nrow(m1)
out = rbind(out, c(p, f, i))
}
}
out = out[-1,]
colnames(out) = c("pop", "freq", "id")
# SOLUTION
> out
pop freq id
[1,] 1 0.25 0
[2,] 1 0.75 1
[3,] 1 0.00 2
[4,] 2 0.20 0
[5,] 2 0.60 1
[6,] 2 0.20 2
[7,] 3 0.00 0
[8,] 3 0.60 1
[9,] 3 0.40 2
[10,] 4 0.00 0
[11,] 4 0.00 1
[12,] 4 1.00 2
我确信使用 data.table
或 table
存在更有效的解决方案,但找不到它。
最佳答案
这是我可能会做的:
as.data.frame(prop.table(table(m),1))
# pop id Freq
# 1 1 0 0.25
# 2 2 0 0.20
# 3 3 0 0.00
# 4 4 0 0.00
# 5 1 1 0.75
# 6 2 1 0.60
# 7 3 1 0.60
# 8 4 1 0.00
# 9 1 2 0.00
# 10 2 2 0.20
# 11 3 2 0.40
# 12 4 2 1.00
如果您希望它按pop
排序,您可以在之后进行。或者,您可以在转换为 data.frame
之前使用 t
转置表格;或在维度 2
上使用 rev(m)
和 prop.table
。
关于r - 对于每个 `pop` 获取 `id` 元素的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880347/