对于每个`pop`获取`id`元素的频率

Rem*_*i.b 2 r data.table

考虑这些数据:

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
Run Code Online (Sandbox Code Playgroud)

我想获得每个独特id的每个独特的频率pop例如,id 1当4的时候出现3次pop == 1,因此id 1in 的频率pop 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
Run Code Online (Sandbox Code Playgroud)

我确信有一个更有效的解决方案使用data.tabletable找不到它.

Fra*_*ank 7

这是我可能做的:

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
Run Code Online (Sandbox Code Playgroud)

如果你想要它排序pop,你可以在之后这样做.或者,您可以t在转换为之前转置表格data.frame; 或使用rev(m)prop.table维度2.

  • 这看起来比我的for循环更好(并且效率更高).+1谢谢 (2认同)