gpt4 book ai didi

r - 在没有NA值的R中使用ave?

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

我有一个庞大的数据框。它看起来像这样:

> b
fips vix
1400 08005 18.58862
1401 47155 10.93712
1402 51191 10.93712
1403 47059 10.93712
1404 08005 10.93712
1405 08059 10.93712
1406 47063 10.93712
1407 37021 10.93712
1408 08031 10.93712
1409 45083 10.93712
1410 37089 10.93712
1411 37113 10.93712
1412 13207 10.93712
1413 08041 10.93712
1414 47093 21.50425
1415 08031 21.50425
1416 37009 21.50425
1417 36103 21.50425
1418 08035 21.50425
1419 08031 53.58363
1420 08035 53.58363
1421 08013 53.58363
1422 55105 21.17450
1423 08001 21.17450
1424 08031 21.17450
1425 47179 21.17450
1426 08059 21.17450
1427 37009 17.35675
1428 08041 17.35675
1429 08031 17.35675
1430 08005 17.35675
1431 08001 NA
1432 08031 NA
1433 47059 NA
1434 47145 NA
1435 13207 NA
1436 37021 NA
1437 37113 NA
1438 37089 NA

为了简单起见,我去掉了一些列,只显示了一小部分行。
我正在尝试更改 Vix 列。我想要做的是:
b$vix <- b$vix - ave(b$vix,b$fips)

应该做的是从每个 Vix 值中减去组均值。例如,对于观测值 1400,我想取所有具有 fips==08005 的观测值的平均值,然后将 18.58862 减去该平均值。
但是,问题是存在 NA 值。我希望平均函数忽略 NA 值。取而代之的是,任何具有一个 NA 的 fips 代码组都变成了 NA:
> b$vix <- b$vix - ave(b$vix,b$fips)
> b
fips vix
1400 08005 2.961125
1401 47155 0.000000
1402 51191 0.000000
1403 47059 NA
1404 08005 -4.690375
1405 08059 -5.118688
1406 47063 0.000000
1407 37021 NA
1408 08031 NA
1409 45083 0.000000
1410 37089 NA
1411 37113 NA
1412 13207 NA
1413 08041 -3.209812
1414 47093 0.000000
1415 08031 NA
1416 37009 2.073750
1417 36103 0.000000
1418 08035 -16.039688
1419 08031 NA
1420 08035 16.039688
1421 08013 0.000000
1422 55105 0.000000
1423 08001 NA
1424 08031 NA
1425 47179 0.000000
1426 08059 5.118688
1427 37009 -2.073750
1428 08041 3.209812
1429 08031 NA
1430 08005 1.729250
1431 08001 NA
1432 08031 NA
1433 47059 NA
1434 47145 NA
1435 13207 NA
1436 37021 NA
1437 37113 NA
1438 37089 NA

如您所见,任何具有 NA 的 fips 现在将为具有相同 fips 的所有其他行提供 NA。
我尝试添加 na.rm=TRUE,但这没有任何作用。我也在考虑添加一个不同的函数,即 ave(b$vix,b$fips,FUN=...) 但我不知道要添加什么。也许有另一种方法可以完全做到这一点。
我希望我能够清楚地解释这个问题。任何和所有的帮助表示赞赏!

最佳答案

您可以使用自定义函数来传递 na.rm=TRUE标志到 mean()

b$vix <- b$vix - ave(b$vix,b$fips, FUN=function(x) mean(x, na.rm=T))

测试过
b<-read.table(text="      fips      vix
08005 18
08005 19
08005 20
47155 10
47155 NA
47155 20", header=T)

b$vix <- b$vix - ave(b$vix,b$fips, FUN=function(x) mean(x, na.rm=T))
b
# fips vix
# 1 8005 -1
# 2 8005 0
# 3 8005 1
# 4 47155 -5
# 5 47155 NA
# 6 47155 5

关于r - 在没有NA值的R中使用ave?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31753005/

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