作者:范二小姐儿 | 来源:互联网 | 2023-02-01 10:23
我有一些调查数据,其中列对应于项目,行对应客户说明他们购买每个项目的可能性.看起来像这样:
item1 = c("Likely", "Unlikely", "Very Likely","Likely")
item2 = c("Likely", "Unlikely", "Very Likely","Unlikely")
item3 = c("Very Likely", "Unlikely", "Very Likely","Likely")
df = data.frame(item1, item2, item3)
我想要一个汇总表,给出每个项目的每个响应的百分比.现在我在每个列上使用table()进行此过程,并且需要操作很多代码.我怎样才能使用plyr或者应用更快的东西?
当前解决方案
d1<-as.data.frame(table(df$item1))
d1$item1_percent<- d1$Freq/sum(d1$Freq)
names(d1)<-c("Response","item1_freqs","item1_percent")
d2<-as.data.frame(table(df$item2))
d2$item2_percent<- d2$Freq/sum(d2$Freq)
names(d2)<-c("Response","item2_freqs","item2_percent")
d3<-as.data.frame(table(df$item3))
d3$item3_percent<- d3$Freq/sum(d3$Freq)
names(d3)<-c("Response","item3_freqs","item3_percent")
results<-cbind(d1,d2[,2:3],d3[,2:3])
注意我不需要频率计数,只需要百分比.
提前致谢!
1> user20650..:
由于您可以使用每个项目#中的相同值范围
sapply(df, function(x) prop.table(table(x)))
# item1 item2 item3
# Likely 0.50 0.25 0.25
# Unlikely 0.25 0.50 0.25
# Very Likely 0.25 0.25 0.50
但如果它们不同,您可以将每个项目#设置为具有一组共同的级别
df[] <- lapply(df, factor, levels=unique(unlist(df)))
sapply(df, function(x) prop.table(table(x)))