2013-01-18 60 views
4

我试图用频率替换数据帧中的值。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") 

我创建了一个表格有两列。

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

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

我的目标是在等等,以取代所有的值到的频率。所以决赛桌应该和blah一样大小,但是我想要的是频率而不是整数。

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

+0

+1的完全重复的例子。 –

+0

乔希的回答很棒;我只是想知道为什么你想创建这个输出矩阵,看它是加载瓦特/冗余值?毕竟,您可以使用'table'输出中的值,并结合该表的'dimnames'值来做任何你能用新的'blah2'矩阵做的事情。 –

回答

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 
+0

它的工作!非常感谢!!!! – Wendy

+0

@ Wendy - 很高兴听到它做到了。 –

1

我面临同样的问题。在我的情况下,我需要这种转换来稍后计算每列的频率乘积,这应该导致多元(多维)数据的频率(概率)。

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

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