2016-07-28 4 views
1

タイトルが説明したように、私はExcelからRに移行していますが、私は本当にトリッキーなデータ操作を実装するのではなく、まだより直感的なExcelであることがわかりR.ExcelからRへの移行:if文とインデックス論理をRで実装する方法は?

私は2つのデータフレームがあります。

A <- read.table(text="Var1 Var2 Var3 Var4 
         1 0 2 0 
         3 4 0 0 
         0 6 0 7", header=T) 
B <- read.table(text="VarA VarB 
         2.24 1.82 
         3.07 2.97 
         6.5 7.46", header=T) 

Iは、以下であるA及びBからの第3データフレームを作成したい:

Result <- read.table(text="Result1 Result2 Result3 Result4 
          2.24  NA  1.82 NA 
          3.07  2.97 NA  NA 
          NA  6.5  NA  7.46", header=T) 

その場合行rデータフレームのカラムcの要素210 <> 0の場合、データフレームの行rおよび列cは、データフレームBの行rの要素を順番に配置します。 enter image description here

答えて

5

matrixオブジェクトは列によって満たされているので、行ない、あなたは彼らが正しい順序で満たされていることを確認するt ranspositionのビットを行う必要があります:

replace(replace(A,TRUE,NA), which(t(A)!=0,arr.ind=TRUE)[,2:1], t(B)) 

#  Var1 Var2 Var3 Var4 
#[1,] 2.24 NA 1.82 NA 
#[2,] 3.07 2.97 NA NA 
#[3,] NA 6.50 NA 7.46 
+0

ありがとうございます。これを大規模な行列にスケーリングするときは注意が必要ですか? – RTrain3k

2

我々は試すことができます@によってコメント

t(sapply(seq_len(nrow(A)), function(i) { 
      x1 <- NA^(!A[i,]) 
      x1[!is.na(x1)] <- B[i,] 
      unlist(x1)})) 
#  [,1] [,2] [,3] [,4] 
#[1,] 2.24 NA 1.82 NA 
#[2,] 3.07 2.97 NA NA 
#[3,] NA 6.50 NA 7.46 

または変更されたコードに基づいて

r1 <- (NA^!A)*unlist(lapply(B, rep, ncol(A)/ncol(B))) 
colnames(r1) <- paste0("Result", 1:ncol(r1)) 
r1 
#  Result1 Result2 Result3 Result4 
#[1,] 2.24  NA 1.82  NA 
#[2,] 3.07 3.07  NA  NA 
#[3,]  NA 6.50  NA 7.46 

:私のような式を使用するExcelで

シャヤ

t(sapply(seq_len(nrow(A)), function(i) { 
      x1 <- ((A>0)^NA)[i,] 
      x1[!is.na(x1)] <- B[i,] 
      unlist(x1)})) 
+1

おかげで@akrun、なぜあるemelemt R1 [2.9] 2.97の代わりに3.07? – RTrain3k

+1

'T(sapply(seq_len(nrow(A))、関数(I){ X1 <- ((A> 0)^ NA)[I、】 ×1 [is.na(X1)!] < - B [I、] (私には少なくとも) – shayaa

+0

@shayaaもっと速いのはなぜですか? 'A> 0'は理解する方が良いです。 – akrun

関連する問題