2017-11-01 14 views
0

平均したいデータフレームに3つの列があります。問題は、列の1つに「NA」と表示されているスペースがあることです。私が働いているデータセットは非常に大きいですが、私は以下の例でそれを簡素化します:R - NAをNaNに変換する

a <- c(1,2,3,4) 
b <- c(2,3,4,5) 
c <- c(3,NA,NA,6) 
df <- data.frame(a,b,c) 
df$mean <- (df$a + df$b + df$c)/3 
df 

    a b c mean 
1 1 2 3 2 
2 2 3 NA NA 
3 3 4 NA NA 
4 4 5 6 5 

私はNA年代を無害なものに置き換えられるようにNaNのように、df$cをフォーマットしたいと思います、またはデータフレーム内にまだ場所を保持している間に平均操作によって無視される他の値であってもよい。もしC列のNAを無視する別の方法があるとすれば、私は満足しています。

+0

方法を試すことができます - NaN'? – mRcSchwering

+0

'df [is.na(df)] < - NaN'は平均操作によって無視されることに注意してください。 'NaN'を返します。 – ANG

+3

「NaN」は平均的な観点から「無害」であることはわかりません。 'mean(c(1、NaN))'は 'NaN'を返します。数値計算のために欠けているデータを処理する方法は、面倒な統計的な質問になる可能性がありますが、無視したいと思うなら、 'na.rm'パラメータが行く方法です。 – HarlandMason

答えて

0

私はapplyがcolsの間で意味を言うと、それはNA

a <- c(1,2,3,4) 
b <- c(2,3,4,5) 
c <- c(3,NA,NA,6) 
df <- data.frame(a,b,c) 
df$mean <- apply(df, 1, mean, na.rm = T) 

dfを無視しなければならないことを意味するために指定しますが、あなたが望むかもしれない列を持つより大きなデータセットに対応するために編集今

a b c mean 
1 2 3 2.0 
2 3 NA 2.5 
3 4 NA 3.5 
4 5 6 5.0 

です平均から除外する...

a <- c(1,2,3,4) 
b <- c(2,3,4,5) 
c <- c(3,NA,NA,6) 
d <- c('excluded', 'from', 'the', 'average') 
df <- data.frame(a,b,c,d) 

df$mean <- apply(df[, c('a', 'b', 'c')], 1, mean, na.rm = T) 
+2

また、 'df $ mean = rowMeans(df、na.rm = T)' – Gregor

+0

私は@Gregorを使用していますが、可能な限りベクトル化された関数を使用します。利用できないときは '[sl] apply()'を使います。データフレームに 'apply()'をしないでください。 – AkselA

+0

@AkselA '[sl] apply'は、関数をデータフレーム列に適用するのに適していますが、行は適用しません。行の関数については、 'apply'、' rowMean'、 'rowSums'などで自動的に行われる' matrix'に変換するのが最も良い方法です。 – Gregor

0

data.tableを使用して、あなたはまた、 `DF [is.na(DF)] <約

library(data.table) 
dt <- as.data.table(df) 
dt[, mean := rowMeans(.SD, na.rm = TRUE), .SDcols = c("a", "b", "c")] 
関連する問題