我有一些调查数据,其中列对应于项目,行对应客户说明他们购买每个项目的可能性.看起来像这样:
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)
Run Code Online (Sandbox Code Playgroud)
我想要一个汇总表,给出每个项目的每个响应的百分比.现在我在每个列上使用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])
Run Code Online (Sandbox Code Playgroud)
注意我不需要频率计数,只需要百分比.
提前致谢!
由于您可以使用每个项目#中的相同值范围
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
Run Code Online (Sandbox Code Playgroud)
但如果它们不同,您可以将每个项目#设置为具有一组共同的级别
df[] <- lapply(df, factor, levels=unique(unlist(df)))
sapply(df, function(x) prop.table(table(x)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
924 次 |
| 最近记录: |