【问题标题】:How to count number of occurence in a large dataset [duplicate]如何计算大型数据集中出现的次数[重复]
【发布时间】:2019-06-27 04:44:32
【问题描述】:

我正在尝试计算 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)

注意** prob 是一个向量,带有观察每个场景的概率

   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 (i in c(1:25))”,这将返回所需输出的右第一列。现在我试图在 25 年内复制这一点。当我输入第二个“for”时,我没有得到想要的输出。

输出应该是这样的:

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

649 是第一年在我的 10 000 次模拟中观察到“场景 0”的次数。

感谢您的帮助

【问题讨论】:

    标签: r count sample replicate


    【解决方案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 年的场景数量(0 到 9),计算 25 年每个场景的数量,然后复制 10 000 次怎么办?
    • @Jng 对不起,我不明白你的意思。如果你只想计算一列,你可以做table(simulation2[1])
    • 好吧,现在我正在模拟 10 000 个情景 (0:9) 超过 25 年。我想要的是在 25 年的时间里模拟场景的发生(0:9),然后重复 10 000 次。我的输出将是一个数据框 10x1 。 10 是场景 0 到 9 的数量,唯一的列是 25 年以上的发生次数
    • @Jng 不会只是将rowSums 添加到上述解决方案中吗? rowSums(sapply(simulation2, function(x) table(factor(x, levels = 0:9)))) 那么呢?它将在所有 25 年中累计出现 0、1、2...。
    • 否,因为每行的总和将超过 10 000
    【解决方案2】:

    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 代码慢一点(在我的机器上使用你的 10 000 行示例大约慢两倍)

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 2022-12-03
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多