如何计算大型数据集中的出现次数

时间:2019-06-27 04:44:32

标签: r count sample replicate

我正在尝试计算25年中数据框中每个“场景”(0到9)的出现次数。 基本上,我有10000个名为0到9的方案的模拟,每个方案都有发生的可能性。

我的数据框太大,无法在此处粘贴,但这里有一个预览:

simulation=as.data.frame(replicate(10000,sample(c(0:9),size=25,replace=TRUE,prob=prob)))

simulation2=transpose(simulation)

注意**概率是一个向量,可以观察每种情况

   v1 v2 v3 v4 v5 v6 ... v25
1   0  0  4  0  2  0      9
2   1  0  0  2  3  0      6
3   0  4  6  2  0  0      0
4
...
10000

这是我到目前为止尝试过的:

for (i in c(1:25)){
  for (j in c(0:9)){
f=sum(simulation2[,i]==j);
vect_f=c(vect_f,f)
  }
  vect_f=as.data.frame(vect_f)
}

如果我省略“ for(c(1:25)中的i)”,这将向我返回所需输出的右第一列。现在,我试图在25年内重现这一点。当我输入第二个“ for”时,没有得到所需的输出。

输出应如下所示:

      (Year) 1  2  3  4  5  6   ... 25
(Scenario)
   0         649
   1         239
   ...
   9          11

649是我的万次模拟中第一年观察到的“方案0”的次数。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我们可以使用table

sapply(simulation2, table)

#    V1   V2   V3   V4   V5 .....
#0 1023 1050  994 1016 1022 .....
#1 1050  968  950 1001  981 .....
#2  997  969 1004  999  949 .....
#3 1031  977 1001  993 1009 .....
#4 1017 1054 1020 1003  985 .....
#......

如果某列中缺少某些值,我们可以将数字转换为包括所有levels的因数

sapply(simulation2, function(x) table(factor(x, levels = 0:9)))

答案 1 :(得分:1)

罗纳克(Ronak)的基本R答案很好用,但我认为他的意思是使用模拟代替模拟2。

sapply(simulation, function(x) table(factor(x, levels = 0:9)))

我尝试使用dplyr进行相同的操作,因为我发现tidyverse代码更具可读性。


simulation %>% 
  rownames_to_column("i") %>% 
  gather(year, scenario, -i) %>% 
  count(year, scenario) %>% 
  spread(year, n, fill = 0)

但是请注意,最后一个选项比base-R代码要慢一些(在您的万行示例中,我的机器上的速度大约慢了两倍)