我有此数据帧,我希望将频率作为每个事件的分数(按簇)。例如,由于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
使用dplyr
,我们可以count
Cluster
和Event
的每个级别,然后计算每个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中,我们可以使用table
和prop.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
这里是使用基数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