gpt4 book ai didi

r - 将计数的数据框转换为 R 中的比例

转载 作者:行者123 更新时间:2023-12-01 08:08:39 25 4
gpt4 key购买 nike

随着时间的推移,我有一个按地区计数的数据框。数据框的一行包含每列的计数总计。我想通过将每个列单元格除以相应列的总数来将数据框从计数转换为比例。一些列包含缺失的观察值。我在下面使用嵌套的 for-loops 完成了此操作但怀疑可能有更简单的方法,也许使用 lapply .我也无法提取计数总计行。

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

my.data = read.table(text = "
state y1970 y1980 y1990 y2000
Alaska 4 6 NA 7
Iowa 10 20 30 40
Nevada 100 100 100 100
Ohio 50 60 NA 80
total 172 195 215 238
Wyoming 8 9 10 11
", sep = "", header = TRUE)

desired.result = read.table(text = "
state y1970 y1980 y1990 y2000
Alaska 0.02325581 0.03076923 NA 0.02941176
Iowa 0.05813953 0.10256410 0.13953488 0.16806723
Nevada 0.58139535 0.51282051 0.46511628 0.42016807
Ohio 0.29069767 0.30769231 NA 0.33613445
total 1.00000000 1.00000000 1.00000000 1.00000000
Wyoming 0.04651163 0.04615385 0.04651163 0.04621849
", sep = "", header = TRUE)

state <- as.vector(unlist(my.data[, 1]))

my.totals <- as.vector(unlist(my.data[ my.data$state=='total', 2:5]))

proportions <- matrix(NA, nrow=nrow(my.data), ncol=ncol(my.data))
proportions <- as.data.frame(proportions)

for(i in 1:nrow(my.data)) {
for(j in 1:ncol(my.data)) {

if(j==1) proportions[i,1] <- state[i]
if(j> 1) proportions[i,j] <- my.data[i,j] / my.totals[j-1]

}
}

colnames(proportions) <- names(my.data)
proportions


# 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

最佳答案

可能是这样的:

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

关于r - 将计数的数据框转换为 R 中的比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com