如何获得数据帧中的频率?

问题描述 投票:0回答:2

我有此数据帧,我希望将频率作为每个事件的分数(按簇)。例如,由于E2在C2中发生2次,并且C2有4个事件,所以该分数将是0.5。

数据data.frame(Event=c("E1", "E2", "E2","E3", "E4"), Cluster=c("C1", "C2", "C2", "C2", "C2"))

Event     Cluster   
E1          C1
E2          C2
E2          C2
E3          C2
E4          C2

这是我想要的输出:

Event     Cluster   Freq
E1          C1       1
E2          C2       0.5
E3          C2       0.25
E4          C2       0.25
python dataframe frequency
2个回答
1
投票

使用dplyr,我们可以count ClusterEvent的每个级别,然后计算每个Cluster的比率。

library(dplyr)

data %>%
 count(Cluster, Event, name = "Freq") %>%
 group_by(Cluster) %>%
 mutate(Freq = Freq/sum(Freq))

#  Cluster Event  Freq
#  <fct>   <fct> <dbl>
#1 C1      E1     1   
#2 C2      E2     0.5 
#3 C2      E3     0.25
#4 C2      E4     0.25

在基本R中,我们可以使用tableprop.table,它们将具有相同的信息,但输出格式不同。

prop.table(table(data), 2)

#     Cluster
#Event   C1   C2
#   E1 1.00 0.00
#   E2 0.00 0.50
#   E3 0.00 0.25
#   E4 0.00 0.25

0
投票

这里是使用基数R的另一种解决方案:

data2 = unsplit(lapply(split(data, data$Cluster), function(df) {
    df$Freq = nrow(df)
    df
}), data$Cluster)

aggregate(data2[,"Freq", drop=FALSE], data2[c("Event","Cluster")],
          function(x) length(x)/x[1])

##   Event Cluster Freq
## 1    E1      C1 1.00
## 2    E2      C2 0.50
## 3    E3      C2 0.25
## 4    E4      C2 0.25
© www.soinside.com 2019 - 2024. All rights reserved.