2017-11-03 5 views
0

2つの列を合計したい場合は、列「apinten」と「apmod」とします。私はそれをやった瞬間のために...私はNaが唯一の二つの列の中に存在する場合にRをNaを無視したいが、私は、2つの列がNAの場合、「ナ」を報告したい:Rの新しい列の2つの列を合計する場合のみNa

etude1<-within(etude1,{mvpascore<-rowSums(cbind(apinten,apmod), na.rm = T, dims = 1)}) 

とそれこれらのコマンドで

etude1<-within(etude1,{mvpascore<-apply(cbind(apinten,apmod), 1, sum, na.rm = TRUE)}) 

、一つだけがRが新しい列内の他の1の値のみを報告欠けているが、両方のapinten列とapmodをNaいる場合には、Rの値が「0」を報告した場合ニュースの列... 0は価値であり、私はそれを望んでいません。

答えて

0

2つのベクトル行を作り直して再現性を持たせました。データの形式はわからないので、あなたはその考えを得るでしょう。データフレームを使用している場合は、列で置き換えることがケーキです。私はまた、長さを計算するときに2つのベクトルが同じサイズであると考えています。

私は最近、私はそれらに取りつかれているので、これらの例ではループしますが、関数を作成してベクトルに適用することもできると思います。

このトリックは、論理的なXOR関数を使って作業する方法を知っています。これは、望ましい出力を与えます。

apinten<-as.vector(c(NA,0,1,NA)) 
apmod<-as.vector(c(0,NA,1,NA)) 
sum_vector<-as.vector(c()) 
vector_length<-length(apinten) 

for (i in 1:vector_length){ 
    if (xor(is.na(apinten[i]),(is.na(apmod[i])))){ 
    sum_vector[i]<-sum(apinten[i],apmod[i],na.rm = TRUE)} 

    else{sum_vector[i]<-sum(apinten[i],apmod[i],na.rm = FALSE)} 
} 

あなたは出力を確認することができ、sum vectorは、(0,0,2,NA)です。

私は、コードがあなたのケースに合わせる必要があり、おそらくもっと良い解決策があることを知っています...しかし、これはあなたが続行するのに役立つと思います。

2

データセットの例を投稿していないので、最初に作成してください。

etude1 <- data.frame(apinten = 1:5, apmod = 11:15) 
etude1$apinten[2:3] <- NA 
etude1$apmod[3:4] <- NA 

今ちょうどapplyデータフレームの各行に匿名関数。この関数は、すべての行の値がNAであるかどうかを判断し、そうでない場合は合計します。 @RuiBarradasポストから例を使用

etude1$mvpascore <- apply(etude1, 1, function(x) 
         ifelse(all(is.na(x)), NA, sum(x, na.rm = TRUE))) 
+0

0を交換するデータセットには、どうもありがとうございました!私はちょうど "機能(x)"が何かを理解していない..あなたは説明できますか? ありがとう –

+0

これは匿名の機能です。 'apply'は、特定のMARGIN(この場合、データフレームの最初の次元)に関数を適用します。したがって、名前のない関数は各行 'x'を処理し、すべての値が' NA'であれば 'NA'を返し、そうでなければその和を返します。 –

0

、別のオプションは、実際にrowSumsと乗算次いで、(のみNAを有する行の場合)、論理マトリックス上rowSumsを使用する1に変換し、NAすることであろうNA

(NA^!rowSums(!is.na(etude1))) * rowSums(etude1, na.rm = TRUE) 
#[1] 12 12 NA 4 20 
関連する問題