我有一个按区域计算的数据框。数据框的一行包含每列的计数总计。我想通过将每个列单元格除以相应列的计数总数,将数据框从计数转换为比例。有些列包含缺少的观察结果我在下面使用嵌套的for-loops
完成了此操作,但怀疑可能有一种更简单的方法,可能使用lapply
。我也无法提取计数总计。
我发布这部分原因是因为我是时候学会使用apply系列函数了,我怀疑它们在这里可能有用,部分是因为我在创建计数总计的向量方面遇到了很多麻烦并怀疑使用{{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