2017-11-11 13 views
0

Imデータセット内の列の平均を計算してapply()を使用して適用する独自の関数を作成しますが、最初の列の平均を返します。以下は私のコード関数内のNA値を無視します。

mymean <- function(cleaned_us){ 
    column_total = sum(cleaned_us) 
    column_length = length(cleaned_us) 
    return (column_total/column_length) 
} 

Average_2 <- apply(numeric_clean_usnews,2,mymean,na.rm=T) 
+1

'sum'も' NAを持っていますあなたは 'colMeans(numeric_clean_usnews、na.rm = TRUE)'を使用することができます。 – akrun

+0

完璧です、それは動作しますが、私はそれが合計の長さを取っているかもしれないと思います要素の量はNAを排除しない。私は長さのためにna.rmを試しました。それはそれを使用しません。また、私はcolMeansを使用することができますが、それは私たち自身を作るようにお願いします –

+0

私は長さに気付かなかった。 'sum(!is.na(cleaned_us)) 'を使うことができます。 – akrun

答えて

1

colMeansができることをその引数

mymean <- function(cleaned_us){ 
    column_total = sum(cleaned_us, na.rm = TRUE) #change 
    column_length = sum(!is.na(cleaned_us)) #change 
    return(column_total/column_length) 
} 

注意を持っていない私たちは、sumna.rm=TRUEを使用する必要があるとapplyでそれを使用してmymeanとして動作するつもりはないです各列にmeanを取得するために使用されます。

+0

それは私にとってはうまくいったが、なぜその長さに対してsum(!is.na(cleaned_us))を行うのだろうか?ちょっと興味があるんだけど! –

+0

@ J.McCraiton '!is.na(cleaned_us)'は、非NA/NA要素に対してTRUE/FALSEの論理ベクトルを与え、 'sum'はそれらの非NAの和、すなわち' sum(! na(c(NA、3,5、NA)))#[1] 2 'である。しかし、「長さ」はここに4を与えます。私はあなたが望んだものだと思っています。そうでなければ、length(cleaned_us [!is.na(cleaned_us)] ')を実行できますが、' sum'に比べて遅くなります – akrun

0

定義した関数にna.rmパラメータを渡すには、関数のパラメータにする必要があります。 sum()関数のパラメータはna.rmですが、length()はありません。だから、あなたが作成しようとしている関数を記述するために、あなたが言うことができる:

# include `na.rm` as a param of the argument 
mymean <- function(cleaned_us, na.rm){ 

    # pass it to `sum()` 
    column_total = sum(cleaned_us, na.rm=na.rm) 

    # if `na.rm` is set to `TRUE`, then don't count `NA`s 
    if (na.rm==TRUE){ 
    column_length = length(cleaned_us[!is.na(cleaned_us)]) 

    # but if it's `FALSE`, just use the full length 
    } else { 
    column_length = length(cleaned_us) 
    } 

    return (column_total/column_length) 
} 

次に、あなたの呼び出しが動作するはずです:

Average_2 <- apply(numeric_clean_usnews, 2, mymean, na.rm=TRUE) 
0

使用na.omit()

set.seed(1) 
m <- matrix(sample(c(1:9, NA), 100, replace=TRUE), 10) 

mymean <- function(cleaned_us, na.rm){ 
    if (na.rm) cleaned_us <- na.omit(cleaned_us) 
    column_total = sum(cleaned_us) 
    column_length = length(cleaned_us) 
    column_total/column_length 
} 

apply(m, 2, mymean, na.rm=TRUE) 

# [1] 5.000 5.444 4.111 5.700 6.500 4.600 5.000 6.222 4.700 6.200 
関連する問題