2016-10-29 6 views
1

Mein Ziel ist es, eine neue Variable zu erstellen, die der Ausgabe von fun (5) für jede Zeile entspricht, aber gerade jetzt bringt Spaß (1: 5) nicht die gewünschte Ausgabe. Bitte teilen Sie mir mit, wie ich eine neue Funktion erstellen kann, die es mir erlaubt, diese Operation vektorisiert auszuführen, da das Schleifen sehr lange dauern würde.Wie kann ich diese Zeichenfolge erstellen?

würde Ich mag f (1: 5), um einen Vektor von 5 Elementen zu erzeugen, die jeweils ein Ausgangssignal von F gegeben Matching (5) in jeder Reihe entspricht.

Dank

names1 = c("x","y","z") 
names2 <- c("hi","hello","bye") 
fun <- function(x){paste(names2[which(df[x,names1] == 1)],collapse = " ")} 
df <- data.frame(a = c(0,1,2,3,4),x = c(0,0,1,0,1),y = c(0,1,0,0,1),z = c(0,1,0,1,0)) 
fun(5) = "hi hello" 
fun(1:5) = "bye NA NA NA NA NA" 
+2

Es ist nicht klar, was willst du? f (1: 5) sollte was zurückgeben? – cryptomanic

+2

Try 'sapply (c (1: 5), fun)' – Zach

+0

Sie sapply verwenden können (1: 5, fun) einen Vektor erhalten [1] "" "Hallo bye" "hallo" "Auf Wiedersehen" "hallo hallo" – cryptomanic

Antwort

2

Sie Vectorize in der folgenden Art und Weise unten (wenn ich das richtig verstehe, was das gewünschte Ergebnis ist) verwenden könnte: zu umgehen und eine Hülle um Ihre Funktion setzt

names1 = c("x","y","z") 
names2 <- c("hi","hello","bye") 
fun <- function(x){ 
      paste(names2[which(df[x,names1] == 1)],collapse = " ") 
} 
df <- data.frame(a = c(0,1,2,3,4), 
       x = c(0,0,1,0,1), 
       y = c(0,1,0,0,1), 
       z = c(0,1,0,1,0)) 
vfun <- Vectorize(fun) 
vfun(5) 
## [1] "hi hello" 
vfun(1:5) 
## [1] ""   "hello bye" "hi"  "bye"  "hi hello" 

Diese im Wesentlichen mit einem Vektor von Werten der Länge> 1.

+0

Dies ist immer noch eine Schleife. Aber ich bin nicht optimistisch, dass dies ohne Schleifen gemacht werden kann. – Roland

+0

@Roland Die obige Antwort vektorisiert den Code wie gewünscht, aber für die Geschwindigkeitsoptimierung ist das eine andere Geschichte, wie Sie wissen. Ich war mir nicht sicher, wie wichtig die Geschwindigkeitsoptimierung wirklich auf dem OP basiert. – steveb

+0

Vectorize ist ein Wrapper für Mapply. Sehen Sie dies für eine Diskussion, wenn dies als "vektorisiert" betrachtet werden sollte: http://stackoverflow.com/q/28983292/1412059 – Roland

Verwandte Themen