Rを始めたばかりで、次のステートメントを実行しました。
library(datasets)
head(airquality)
s <- split(airquality,airquality$Month)
sapply(s, function(x) {colMeans(x[,c("Ozone", "Solar.R", "Wind")], na.rm = TRUE)})
lapply(s, function(x) {colMeans(na.omit(x[,c("Ozone", "Solar.R", "Wind")])) })
sapply
の場合、次を返します。
5 6 7 8 9
Ozone 23.61538 29.44444 59.115385 59.961538 31.44828
Solar.R 181.29630 190.16667 216.483871 171.857143 167.43333
Wind 11.62258 10.26667 8.941935 8.793548 10.18000
lapply
の場合、次を返します。
$`5`
Ozone Solar.R Wind
24.12500 182.04167 11.50417
$`6`
Ozone Solar.R Wind
29.44444 184.22222 12.17778
$`7`
Ozone Solar.R Wind
59.115385 216.423077 8.523077
$`8`
Ozone Solar.R Wind
60.00000 173.08696 8.86087
$`9`
Ozone Solar.R Wind
31.44828 168.20690 10.07586
さて、私の質問は、なぜ返される値は似ているが、同じではないのでしょうか? na.rm = TRUE
とna.omit
はまったく同じことをしているはずではありませんか?欠損値を省略し、現在の値についてのみ平均を計算しますか?そして、その場合、両方の結果セットに同じ値を設定してはいけませんか?
ご意見ありがとうございます!
彼らは同じ結果を与えることになっていない。この例を考えてみましょう:
exdf<-data.frame(a=c(1,NA,5),b=c(3,2,2))
# a b
#1 1 3
#2 NA 2
#3 5 2
colMeans(exdf,na.rm=TRUE)
# a b
#3.000000 2.333333
colMeans(na.omit(exdf))
# a b
#3.0 2.5
どうしてこれなの?最初の場合、列b
の平均は(3+2+2)/3
を介して計算されます。 2番目のケースでは、2番目の行が削除されますその全体で(b
の値で、NAではないため、最初のケースで考慮されます)na.omit
したがって、b
平均は(3+2)/2
にすぎません。
sapply(s, function(x) {colMeans(x[,c("Ozone", "Solar.R", "Wind")], na.rm = TRUE)})
は各列を個別に扱い、各列の非NA値の平均を計算します。
lapply(s, function(x) {colMeans(na.omit(x[,c("Ozone", "Solar.R", "Wind")])) })
サブセットs
は、3つの列のいずれもNA
でない場合に、結果データの列平均を取ります。
違いは、1つまたは2つの値がNA
である行に由来します。