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

标签 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

我想获取每个唯一pop中每个唯一id的频率?例如,id 1<当 pop == 1 时, 在 4 次中出现 3 次,因此 pop 1id 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.tabletable 存在更有效的解决方案,但找不到它。

最佳答案

这是我可能会做的:

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/

相关文章:

r - Octave和R之间的接口(interface)

r - Blogdown 网站帖子 - 隐藏日期和/或帖子标题

r - 如何从同一图上的单个文件中获取多年的 Y 轴数据?

r - 在ggplot2中获取绘图区域的宽度

r - 在不使用 apply 的情况下从 data.table 行创建向量

r - 在 j 表达式中再次使用函数结果

R xts pkg 和季度数据

r - data.table 中 mutate_at (dplyr) 的等价物是什么?

r - 更新 data.table 中的多列

R data.table 加入左右表之间的不平等条件