4

我正在尝试用频率替换数据框中的值。

这是我的数据:

blah<-list(c(1,1,2,2,3,1,3,2,2,5,5), c(7,8,7,8,9,9,7,8,9,7,7))
blah<-as.data.frame(blah)
colnames(blah)<-c("col1","col2")

我创建了一个包含两列的表。

接下来,我使用“表”为两列生成频率:

col1Freq<-table(blah[,1])/dim(blah)[1]
col2Freq<-table(blah[,2])/dim(blah)[1]

我的目标是将blah中的所有值替换为频率。所以最终表的大小应该与blah相同,但我想要频率而不是整数。

对不起,我没有任何照片可显示....谢谢您的帮助!!!!

4

2 回答 2

4

如果我正确理解了您的问题,则基本 R 函数ave()(不要注意其误导性名称)将满足您的需求。

blah2 <- 
transform(blah,
          col1Freq = ave(col1, col1, FUN=function(X) length(X)/nrow(blah)),
          col2Freq = ave(col2, col2, FUN=function(X) length(X)/nrow(blah)))

blah2[3:4]
#     col1Freq  col2Freq
# 1  0.2727273 0.4545455
# 2  0.2727273 0.2727273
# 3  0.3636364 0.4545455
# 4  0.3636364 0.2727273
# 5  0.1818182 0.2727273
# 6  0.2727273 0.2727273
# 7  0.1818182 0.4545455
# 8  0.3636364 0.2727273
# 9  0.3636364 0.2727273
# 10 0.1818182 0.4545455
# 11 0.1818182 0.4545455
于 2013-01-18T17:17:46.580 回答
1

我遇到了同样的问题。就我而言,我需要这种转换来稍后计算每列的频率乘积,这应该会导致多变量(多维)数据的频率(概率)。

我的解决方案适用于任意数量的列:

apply(blah,2,function(x){
 t = as.data.frame(table(x))
 t$Freq[match(x,t[,1])]/length(x)
})
于 2015-01-15T10:43:27.907 回答