R频率表:如果变量中的所有数据点共享结果,prop.table不起作用?

时间:2016-01-18 21:33:07

标签: r apply

想象一下,您有以下数据集:

df<-data.frame(read.table(header = TRUE, text = "
ID  Wine    Beer    Water   Age Gender
1   0   1   0   20  Male
2   1   0   1   38  Female
3   0   0   1   32  Female
4   1   0   1   30  Male
5   1   1   1   30  Male
6   1   1   1   26  Female
7   0   1   1   36  Female
8   0   1   1   29  Male
9   0   1   1   33  Female
10  0   1   1   20  Female"))

此外,想象一下,您想要编制汇总表格,打印出那些饮用葡萄酒,啤酒和水的频率。

我解决了这个问题。

con<-apply(df[,c(2:4)], 2, table)
con_P<-prop.table(con,2)

完美无缺。没问题。现在,让我们按如下方式调整数据集:我们将水的所有条目设置为1

df&lt; -data.frame(read.table(header = TRUE,text =&#34;

df<-data.frame(read.table(header = TRUE, text = "
ID  Wine    Beer    Water   Age Gender
1   0   1   1   20  Male
2   1   0   1   38  Female
3   0   0   1   32  Female
4   1   0   1   30  Male
5   1   1   1   30  Male
6   1   1   1   26  Female
7   0   1   1   36  Female
8   0   1   1   29  Male
9   0   1   1   33  Female
10  0   1   1   20  Female"))

如果我现在运行以下命令:

con<-apply(df[,c(2:4)], 2, table)
con_P<-prop.table(con,2)

它在第二行之后给出了以下错误消息:Error in margin.table(x, margin) : 'x' is not an array!为什么呢?

如果变量中的所有数据点都具有相同的结果,为什么会有所不同?另外,我可以做些什么来规避这个问题呢?谢谢你们!

1 个答案:

答案 0 :(得分:3)

函数prop.table使用函数sweep,它将数组作为第一个参数。由于您的第二个con是列表而不是数组,因此prop.table将失败。

为什么您的第二个con列表?因为列Water只有一个元素而所有其他列都有2个元素。当元素数量不同时apply无法简化数组的结果并为您提供列表。

在您给我们的示例中,更安全的方法是使用lapply代替,它总是会给出一个包含结果的列表:

con <- lapply(df, table)
con_P <- lapply(con, function(x) x/sum(x))