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