想象一下,您有以下数据集:
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
!为什么呢?
如果变量中的所有数据点都具有相同的结果,为什么会有所不同?另外,我可以做些什么来规避这个问题呢?谢谢你们!
答案 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))