将计数的数据帧转换为R中的比例

时间:2012-11-21 23:12:40

标签: r

我有一个按区域计算的数据框。数据框的一行包含每列的计数总计。我想通过将每个列单元格除以相应列的计数总数,将数据框从计数转换为比例。有些列包含缺少的观察结果我在下面使用嵌套的for-loops完成了此操作,但怀疑可能有一种更简单的方法,可能使用lapply。我也无法提取计数总计。

我发布这部分原因是因为我是时候学会使用apply系列函数了,我怀疑它们在这里可能有用,部分是因为我在创建计数总计的向量方面遇到了很多麻烦并怀疑使用{{1会有所帮助。感谢您提供有关更有效地编写上述代码的任何建议。

[[

1 个答案:

答案 0 :(得分:4)

可能就是这样:

df[, -1] <- lapply( df[ , -1], function(x) x/sum(x, na.rm=TRUE) )

如果是矩阵,您可以使用prop.table(mat)。但是,在这种情况下,您需要限制仅在数字列上工作(通过排除第一列)。

此外,我认为你需要排除“总”行:

 my.data[-5, -1] <- lapply( my.data[ -5 , -1], function(x){ x/sum(x, na.rm=TRUE)} )
 my.data[ -5 , ]
    state      y1970      y1980      y1990      y2000
1  Alaska 0.02325581 0.03076923         NA 0.02941176
2    Iowa 0.05813953 0.10256410 0.21428571 0.16806723
3  Nevada 0.58139535 0.51282051 0.71428571 0.42016807
4    Ohio 0.29069767 0.30769231         NA 0.33613445
6 Wyoming 0.04651163 0.04615385 0.07142857 0.04621849

-------------

替代方法:

> my.data[,-1] <-lapply( my.data[  , -1], function(x){ x/x[5] } )
> my.data
    state      y1970      y1980      y1990      y2000
1  Alaska 0.02325581 0.03076923         NA 0.02941176
2    Iowa 0.05813953 0.10256410 0.13953488 0.16806723
3  Nevada 0.58139535 0.51282051 0.46511628 0.42016807
4    Ohio 0.29069767 0.30769231         NA 0.33613445
5   total 1.00000000 1.00000000 1.00000000 1.00000000
6 Wyoming 0.04651163 0.04615385 0.04651163 0.04621849

这显示了prop.table在两个边距上使用时将返回缺失值,然后分别在行和列上使用非常简单的矩阵:

> prop.table( matrix( c( 1,2,NA, 3),2) )
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA
> prop.table( matrix( c( 1,2,NA, 3),2), 1 )
     [,1] [,2]
[1,]   NA   NA
[2,]  0.4  0.6
> prop.table( matrix( c( 1,2,NA, 3),2), 2 )
          [,1] [,2]
[1,] 0.3333333   NA
[2,] 0.6666667   NA