2017-01-22 3 views
0

ich bearbeiten diese Frage (hoffentlich nach Wunsch)R eine ifelse Aussage zu jeder Zelle eines data.frame Anwendung

Ich brauche jede Zelle eines data.frame zu überprüfen, ob es Wert ist in bestimmtem Bereich liegt. Ich bin sehr neu zu bewerben und muss daran arbeiten, es zu verstehen.

Ich habe 2 data.frames:

  • blood_df: 158 Spalten,

  • stat_df: Statistiken für jede Spalte von blood_df

Beigefügt ist ein minimal Beispiel zur Erläuterung :

bisher habe ich das, aber es berechnet das gleiche Ergebnis für jede Zelle.

c0 <- c(0,0,0,0) 
c1 <- c(1,2,3,4) 
c2 <- c(5,6,7,8) 
c3 <- c(9,10,11,12) 
c4 <- c(13,14,15,16) 

blood_df <- data.frame(c0,c1,c2,c3,c4) 
stat_df <- data.frame(matrix(ncol = 5, nrow = 6)) 
colnames(stat_df) <- colnames(blood_df) 
rownames(stat_df) <- c("Mean","3*sd","sum", "Mean2","-3*sd","sum2") 

stat_df[1,2:5] <-apply(blood_df[,2:5], 2, mean, na.rm = TRUE) 
stat_df[2,2:5] <-apply(blood_df[1:4,2:5], 2, function(x) 3*sd(x,na.rm=TRUE)) 
stat_df[3,] <-colSums(stat_df[1:2,]) 
stat_df[4,2:5] <-apply(blood_df[,2:5], 2, mean, na.rm = TRUE) 
stat_df[5,2:5] <-apply(blood_df[1:4,2:5], 2, function(x) -3*sd(x,na.rm=TRUE)) 
stat_df[6,] <-colSums(stat_df[4:5,]) 

blood_df: 
## c0 c1 c2 c3 c4 
## 1 0 1 5 9 13 
## 2 0 2 6 10 14 
## 3 0 3 7 11 15 
## 4 0 4 8 12 16 

stat_df: 
##  c0  c1  c2  c3  c4 
## Mean NA 2.500000 6.500000 10.500000 14.500000 
## 3*sd NA 3.872983 3.872983 3.872983 3.872983 
## sum NA 6.372983 10.372983 14.372983 18.372983 
## Mean2 NA 2.500000 6.500000 10.500000 14.500000 
## -3*sd NA -3.872983 -3.872983 -3.872983 -3.872983 
## sum2 NA -1.372983 2.627017 6.627017 10.627017 

der Teil, der nicht funktioniert, wie ich es brauche:

blood_df[1:4,2:5] <- apply(blood_df[,2:5],2, function(x) 
        (ifelse((x > (stat_df[3,2:5]))|| 
        (x < (stat_df[6,2:5])), NA, x))) 

es mir Bisher gibt:

blood_df: 
## c0 c1 c2 c3 c4 
## 1 0 1 1 1 1 
## 2 0 5 5 5 5 
## 3 0 NA NA NA NA 
## 4 0 NA NA NA NA 

Was ich ist erhalten möchten: (zu überprüfen wenn jeder Wert zwischen einem bestimmten Bereich liegt)

blood_df: 
## c0 c1 c2 c3 c4 
## 1 0 1 5 9 13 
## 2 0 2 6 10 14 
## 3 0 3 7 11 15 
## 4 0 4 8 12 16 

Wenn Es liegt nicht im Bereich, der Wert sollte sich in NA ändern.

Danke!

+1

Können Sie uns ein repro Beispiel nennen? Dies würde die Beantwortung der Frage erleichtern. :) –

+1

Und bitte auch ein Beispiel für die gewünschte Ausgabe hinzufügen. – ekstroem

+2

[Info, wie man ein reproduzierbares Beispiel gibt] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610) – Jaap

Antwort

1

Versuchen mapply:

column_range = 2:5 
blood_df[, column_range] = mapply(function(blood, stat){ 
     ifelse((blood > stat[3]) | (blood < stat[6]), NA, blood) 
    }, 
    blood_df[, column_range], 
    stat_df[, column_range], 
    SIMPLIFY = FALSE 
) 
+0

Eigentlich möchten Sie vielleicht "SIMPLIFY" arg als 'TRUE' (der Standardwert), um an Datenframe-Spalten zu binden. Für sich genommen entspricht dies Map() und gibt eine Liste von Vektoren zurück. – Parfait

+2

@Parfait Die Ergebnisliste wird den ursprünglichen Spalten zugeordnet. Reproduzierbares Beispiel: 'iris [, 1: 4] = lapply (iris [, 1: 4], Skala)'. Und ich denke, es ist robuster und schneller Methode als Konversation zu Matrix und Bindung zurück zu data.frame. –