2016-07-28 9 views
1

Wie der Titel beschreibt, die ich von Excel R am Übergang, aber ich finde, dass statt R.Übergang von Excel zu R: Wie zu implementieren, wenn Anweisung und Index Logik in R?

in Excel wirklich schwierig Datenmanipulation Umsetzung noch intuitiver ist, ich habe zwei Datenrahmen:

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) 
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) 

Also, wenn ein Element in der Zeile und die Spalte rc von Datenrahmen

:

ich mag einen dritten Datenrahmen von A und B schaffen, die eine ist folgendermaßen 210 <> 0, dann in Zeile r und Spalte c des Datenrahmens Results Platz, in sequenzieller Reihenfolge, Elemente aus Zeile r des Datenrahmens B.

In Excel ich eine Formel wie verwenden würde: enter image description here

Antwort

5

Da matrix Objekte durch Spalte gefüllt sind, nicht rudern, Sie haben ein wenig t MSETZUNG zu tun, um sicherzustellen, dass sie in der richtigen Reihenfolge gefüllt:

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

vielen Dank. Gibt es etwas, auf das man beim Skalieren auf größere Matrizen achten sollte? – RTrain3k

2

Wir

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 

Basierend auf dem Kommentar

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 

oder eine modifizierte Code von @ versuchen können, Shaya

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

Dank @akrun, warum ist emelemt r1 [2,2] 3,07 statt 2,97? – RTrain3k

+1

't (sapply (seq_len (nrow (A)), Funktion (i) { x1 <- ((A> 0)^NA) [i,] x1 [! Is.na (x1)] <- B [i,] unlist (x1)})) 'sollte schneller und verständlicher sein (zumindest für mich) – shayaa

+0

@shayaa Warum ist es schneller? Das 'A> 0' ist besser zu verstehen. – akrun