如何计算大型数据集中出现的次数
How to count number of occurence in a large dataset
我正在尝试计算 25 年来数据框中每个 "scenarios" 的出现次数(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))",这个 returns 我就是所需输出的右第一列。现在我正试图在 25 年内复制它。当我放置第二个 'for' 时,我没有得到所需的输出。
输出应如下所示:
(Year) 1 2 3 4 5 6 ... 25
(Scenario)
0 649
1 239
...
9 11
649 是第一年在我的 10 000 次模拟中观察到 'scenario 0' 的次数。
感谢您的帮助
我们可以使用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)))
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 行示例在我的机器上大约慢两倍)
我正在尝试计算 25 年来数据框中每个 "scenarios" 的出现次数(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))",这个 returns 我就是所需输出的右第一列。现在我正试图在 25 年内复制它。当我放置第二个 'for' 时,我没有得到所需的输出。
输出应如下所示:
(Year) 1 2 3 4 5 6 ... 25
(Scenario)
0 649
1 239
...
9 11
649 是第一年在我的 10 000 次模拟中观察到 'scenario 0' 的次数。
感谢您的帮助
我们可以使用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)))
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 行示例在我的机器上大约慢两倍)