在没有NA值的情况下在R中使用ave?

时间:2015-07-31 18:41:53

标签: r

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

> 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 = ...),但我不知道要添加什么。也许有另一种方法可以完全做到这一点。 我希望我能够清楚地解释这个问题。任何和所有的帮助表示赞赏!

1 个答案:

答案 0 :(得分:10)

您可以使用自定义功能将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