gpt4 book ai didi

用列组的平均值替换 NA

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

我想找到列组中所有值的均值。给定的一组列可能包含缺失的观察值。我想用该组列的平均值替换一组列中缺失的观察值。在我的例子中,每组的列数是一个常数,years

以下是执行此操作的代码。但是,我希望有人可以提供更高效的代码。 lapply 查找给定列组的平均值。但是,我还没有想出类似的方法来替换缺失的观察结果。谢谢你的建议。

这是一个示例数据集:

my.first.year <- 1980
my.last.year <- 1982
years <- (my.last.year - my.first.year) + 1

x = read.table(text = "
city county state a80 a81 a82 b80 b81 b82
1 B AA 2 20 200 4 8 12
2 B AA 4 NA 400 5 9 NA
1 C AA 6 60 NA NA 10 14
2 C AA NA 80 800 7 11 15
", sep = "", header = TRUE, stringsAsFactors = FALSE)

(2 + 4 + 6 + 20 + 60 + 80 + 200 + 400 + 800) / 9
(4 + 5 + 7 + 8 + 9 + 10 + 11 + 12 + 14 + 15) / 10

my.means <- lapply( seq(4, ncol(x), years) , function(i) { mean(unlist(x[,i : (i+years-1) ]) , na.rm=TRUE) } )
my.means

x2 <- x

x2[,(3+years*0+1):(3+years*1)][is.na(x2[,(3+years*0+1):(3+years*1)])] = my.means[[1]]
x2[,(3+years*1+1):(3+years*2)][is.na(x2[,(3+years*1+1):(3+years*2)])] = my.means[[2]]

结果如下:

#   city county state      a80      a81      a82 b80 b81  b82
# 1 1 B AA 2.0000 20.0000 200.0000 4.0 8 12.0
# 2 2 B AA 4.0000 174.6667 400.0000 5.0 9 9.5
# 3 1 C AA 6.0000 60.0000 174.6667 9.5 10 14.0
# 4 2 C AA 174.6667 80.0000 800.0000 7.0 11 15.0

最佳答案

这是另一种使用基础 R 中的 reshape 的解决方案,这是一个经常被遗忘的函数,具有惊人的功能。

x2 = reshape(x, direction = 'long', varying = 4:9, sep = "")
x2[,c('a', 'b')] = apply(x2[,c('a', 'b')], 2, function(y){
y[is.na(y)] = mean(y, na.rm = T)
return(y)
})
x3 = reshape(x2, direction = 'wide', idvar = names(x2)[1:3], timevar = 'time',
sep = "")

这是它的工作原理。首先,我们将数据 reshape 为长格式,其中 ab 成为列,年份成为行。其次,我们用它们各自的方式替换列 ab 中的 NA。最后,我们将数据重新整形为宽格式。 reshape 是一个令人困惑的功能,但通过帮助页面上的示例可以帮助您快速上手。

编辑

要重新排序列,您可以这样做

x3[,names(x)]

要替换行名,您可以这样做

rownames(x3) = 1:NROW(x3)

关于用列组的平均值替换 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14519370/

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