R用频率替换值

R用频率替换值,r,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") blah如果我正确理解了您的问题,那么基本R函数ave()(不要注意它的误导性名称)将满足您的要求 blah2 <- transform(blah, col1F

我试图用频率替换数据帧中的值

以下是我的数据:

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

blah如果我正确理解了您的问题,那么基本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

blah2我也面临同样的问题。在我的例子中,我需要这样的转换来计算每个列的频率乘积,这将导致多变量(多维)数据的频率(概率)

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

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

+1对于完全可复制的示例,Josh的回答很好;我只是想知道为什么要创建这个输出矩阵,因为它加载了冗余值?毕竟,您可以使用
表格
输出中的值,结合该表格的
dimnames
值,对新的
blah2
矩阵执行任何操作。
apply(blah,2,function(x){
 t = as.data.frame(table(x))
 t$Freq[match(x,t[,1])]/length(x)
})