R用频率替换值

时间:2013-01-18 17:10:37

标签: r

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

这是我的数据:

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")

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

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

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

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

抱歉,我没有任何照片可以展示....感谢您的帮助!!!!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我遇到了同样的问题。在我的情况下,我需要进行这样的转换,以便稍后计算每列的频率乘积,这应该导致多变量(多维)数据的频率(概率)。

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

apply(blah,2,function(x){
 t = as.data.frame(table(x))
 t$Freq[match(x,t[,1])]/length(x)
})