这可能有点迟钝了问题标题,因为我还在快速掌握R但是我正在做一些数据帧操作以提取一列所捕获的分类组的某些百分比这是我希望获得百分比的另一个列的因素。我将使用内置的mtcars来展示我想要实现的目标,其中齿轮正在扮演分类变量的角色,而cyl是我试图获得百分比的数据。< / p>
一些背景细节可以解决问题:
gear
列涵盖3个不同的值3,4,5
。
cyl
列也包含3个不同的值,4,6,8
我列表中的第一个元素表示齿轮类型的百分比最多有4个气缸。对于3档车型,在总共15个3档车型中只有一辆丰田Corona,因此百分比应为1/15 = 0.0667。对于4档车型,共有12个4档车型中的8个,产量为8/12 = 0.667。
现在这里是我写这个计算的方法。然而输出的结构不是我想要的。我想要的是将这一切合并到一个数据框中,第一列是不同的圆柱值,其他列是齿轮类型的3,4和5,其中行是各种百分比。我非常接近,但需要一些帮助来完成我目前正在实现的列表的数据重塑,或者甚至可以执行一个替代的应用功能,它将实现我追逐的百分比表,或任何其他魔术的人可以做饭。
> lapply( unique( sort( y$cyl ) ) , function(c) { tapply( y$cyl , y$gear , function(x) sum( x <= c ) / length(x) ) } )
[[1]]
3 4 5
0.06666667 0.66666667 0.40000000
[[2]]
3 4 5
0.2 1.0 0.6
[[3]]
3 4 5
1 1 1
这是我们期望的数据框架我希望显示为
cyl X3 X4 X5
1 4 0.06666667 0.6666667 0.4
2 6 0.20000000 1.0000000 0.6
3 8 1.00000000 1.0000000 1.0
答案 0 :(得分:1)
在谷歌搜索“将数组列表转换为data.frame”后,我想出了一个解决方案,它立即引导我进入以下SO post。
p <- lapply( unique( sort( mtcars$cyl ) ) , function(c) { tapply( mtcars$cyl , mtcars$gear , function(x) sum( x <= c ) / length(x) ) } )
> df <- data.frame( matrix( unlist(p) , nrow = length(p) , byrow=T ) )
> df
X1 X2 X3
1 0.06666667 0.6666667 0.4
2 0.20000000 1.0000000 0.6
3 1.00000000 1.0000000 1.0
除了将分类名称作为列标题删除之外,该解决方案还可以工作,但是看起来像是跟进分配,这也可以恢复......
> colnames(df) <- names(p[[1]])
> rownames(df) <- unique( sort( mtcars$cyl ) )
> df
3 4 5
4 0.06666667 0.6666667 0.4
6 0.20000000 1.0000000 0.6
8 1.00000000 1.0000000 1.0
实际上,链接问题的其他答案很好地解决了列标题问题,行标题问题仍然存在,因为这些值在我的匿名函数调用中丢失了。