2016-07-12 6 views
1

Ich habe data.frame-Objekt, das aus zwei Vektoren v1, v2 besteht. Wie Sie aus meinen Daten sehen können, enthält v1 0e + 00, ich möchte diese Werte der Zeile zuweisen, die 0e + 00 enthält. Ich habe versucht, das zu tun, aber ich habe nicht bekommen, was ich erwartet habe. Wie kann man das in R machen? Doch dies ist mein Versuch, dies zu tun, aber es wird nicht funktionieren:Wie ersetzen Sie Nicht-Null-Werte als Standard in data.frame-Objekt zeilenweise?

res<- apply(data, 1, function(ro) { 
    tmp<- ifelse(length(ro[[1]]==0 & !length(ro[[2]])==0),0e+00, ro) 
}) 

reproduzierbares Beispiel wie folgt:

v1 <- c(1e-06,1e-05,0e+00,0e+00,0e+00,1e-07,0e+00) 
v2 <- c(4.551651e-38,3.519523e-33,6.316980e-26,8.159048e-34, 
     4.935429e-20,4.551651e-38,9.080082e-38) 

dat <- data.frame(v1, v2) 

Meine gewünschte Ausgabe (I manuell hier tat um zu zeigen, wie es aussieht, Ähnliches):

DataFrame with 7 rows and 2 columns 
     v1 v2 
    <numeric> <numeric> 
1  1e-06 4.551651e-38 
2  1e-05 3.519523e-33 
3  0e+00 0e+00 
4  0e+00 0e+00 
5  0e+00 0e+00 
6  1e-07 4.551651e-38 
7  0e+00 0e+00 

dann möchte ich diese Zeile auszulöschen enthält 0E + 00, so endgültig gewünschte Ausgabe:

DataFrame with 7 rows and 2 columns 
     v1 v2 
    <numeric> <numeric> 
1  1e-06 4.551651e-38 
2  1e-05 3.519523e-33 
3  1e-07 4.551651e-38 

Wie kann ich meine gewünschte Ausgabe erhalten?

+3

'Daten <- [! Data $ V1 = 0] -Daten'? – scoa

+0

@scoa: es gab mir nicht, was ich erwartet hatte. Irgendeine bessere Idee? Danke – Jeff

Antwort

3

Sie müssen die Einträge entfernen, indem !=

v1 <- c(1e-06,1e-05,0e+00,0e+00,0e+00,1e-07,0e+00) 
v2 <- c(4.551651e-38,3.519523e-33,6.316980e-26,8.159048e-34, 
     4.935429e-20,4.551651e-38,9.080082e-38) 

dat <- data.frame(v1, v2) 

dat[dat$v1 != 0e+00,] 
+0

Danke für Ihre Lösung. – Jeff

2

Verwendung Als @scoa sagte:

#show data where v1 equals 0 (0e+00) 
dat[dat$v1 == 0,] 

    v1   v2 
3 0 6.316980e-26 
4 0 8.159048e-34 
5 0 4.935429e-20 
7 0 9.080082e-38 

#show v2 where v1 equals 0 (0e+00) 
dat$v2[dat$v1 == 0] 

[1] 6.316980e-26 8.159048e-34 4.935429e-20 9.080082e-38 

#Remove rows where v1 equals 0 
dat[dat$v1 != 0,] 

    v1   v2 
1 1e-06 4.551651e-38 
2 1e-05 3.519523e-33 
6 1e-07 4.551651e-38 
+0

@scoa: Vielen Dank für diese schnelle Lösung. Ich kann eine korrekte Ausgabe erhalten. – Jeff

2

Nicht sicher, ob dies ist, was Sie suchen:

dat[dat$v1 == 0,][,2] <- 0e+00 
dat[dat$v1 != 0,] 
+0

Danke. Ihre Lösung ist ziemlich nah an dem, was ich erwartet habe. Ich habe jedoch die Antwort von Sergio angenommen. – Jeff

2

Verwenden Sie die Funktion grepl für den zweiten Ausgang

dat <- dat[!grepl("^0",dat$v1),] 
    v1   v2 
1 1e-06 4.551651e-38 
2 1e-05 3.519523e-33 
6 1e-07 4.551651e-38 

für die erste Ausgabe können Sie die gleiche Funktion nutzen zu

dat$v2 <- ifelse(grepl("^0",dat$v1),0e+00, dat$v2) 
dat 
    v1   v2 
1 1e-06 4.551651e-38 
2 1e-05 3.519523e-33 
3 0e+00 0.000000e+00 
4 0e+00 0.000000e+00 
5 0e+00 0.000000e+00 
6 1e-07 4.551651e-38 
7 0e+00 0.000000e+00 
+0

Danke. Ihre Antwort ist auch sehr interessant. – Jeff