2016-04-18 10 views
3

Ich bin ein Newby in R mit etwas Hintergrund in mehr prozeduralen Sprachen. Derzeit versuche ich, unnötige "for" -Schleifen zu umgehen und sie mit etwas aus der anwendenden Familie zu versehen. Also hier ist mein Problem:Schleifen durch Zeilen mit Lapply mit einer bedingten

  • Sagen wir, ich habe einen Vektor: data <- c(0.0008, 0.0007, 0.0040, 0.0081, 0.0217, 0.0292, 0.0332, 0.0451, 0.0533, 0.0621)
  • Und das möchte ich es in einen Vektor zur Transformation mit nur steigenden Datenpunkten. Der Einfachheit halber möchte ich sagen, dass ich möchte, dass alle Elemente wie das zweite Element (das kleiner ist als das vorherige Element) zum Durchschnitt des vorherigen und des nächsten Elements werden.
  • Dazu habe ich versucht, so etwas zu verwenden: data <- lapply(data, function(i) ifelse(data[i+1]<data[i], data[i+1]<-(data[i]+data[i+2])/2, data[i+1]))
  • Das Ergebnis ist eine Liste (kein Vektor) mit allen Elementen wie folgt aus: logical(0)

ich kann nicht herausfinden, wo mein Fehler ist - was ich hier fehlt?

Antwort

4

lapply ist für mehrere Objekte in einer Liste iterieren und gibt eine Liste. Lesen Sie ?lapply. Mit nur einem Vektor brauchen Sie es nicht.

Hier ist eine nicht-Schleife Weg, um darüber zu gehen:

w = which(c(FALSE, tail(data, -1) < head(data, -1))) 
data[w] = (data[w-1] + data[w+1])/2 

Wenn Sie in Folge abnehm Elemente haben, wird Ihr Verfahren seltsame Ergebnisse. Versuchen Sie zum Beispiel mit data = c(2, 1, 0, 3), und beachten Sie, dass das Ergebnis immer noch nicht monoton ist. Also, ich denke, Sie sollten wahrscheinlich nicht versuchen, auf diese Weise zu vektorisieren und sollte wirklich eine Schleife verwenden. Außerdem müssen Sie überlegen, was zu tun ist, wenn das letzte Element abfällt, z. B. c(2,3,0).

1

I denke, dies funktioniert, vorausgesetzt, dass ich Ihr Problem richtig verstehe.

data <- c(0.0007, 0.0006, 0.0030, 0.0072, 0.0129, 0.0195, 0.0268, 0.0346, 0.0426, 0.0507) 

d1 <- head(data, -1) # get the first 9 elements 
d2 <- tail(data, -1) # get the last 9 elements 

means <- rowMeans(cbind(d1, d2)) # get the mean of all data[i] & data[i+1] pairs 
ifelse(d2 < d1, means, d2) 
# [1] 0.00065 0.00300 0.00720 0.01290 0.01950 0.02680 0.03460 
# [8] 0.04260 0.05070 

# realized we might need to append back the first element of our original data. If so: 
data <- c(data[1], ifelse(d2 < d1, means, d2)) 
data 
# [1] 0.00070 0.00065 0.00300 0.00720 0.01290 0.01950 0.02680 
# [8] 0.03460 0.04260 0.05070