2017-06-05 7 views
-1

Ich habe folgende Daten:Bedingte Anweisungen mit zu vielen ifelse Aussagen

my.list<-list(a=c(55,17,18,18,18,21), 
b=c(11,17,17,17,22,18,22), 
c=c(55,17,22,22,22,22,22,21,30))  

x<-c(1,1,1,1,2,2,3,3,3,3,3,3,3,3,3)  

set.seed(1)  

my.function <- function(x) { 

ifelse(x == 1,sample(my.list$a,replace = T), 
ifelse(x == 2,sample(my.list$b,replace = T), 
ifelse(x == 3,sample(my.list$c,replace = T) 


)))  
}   

p<-sapply(x, my.function)  

In der „realen“ Daten-Set ich viel mehr ifelse-Aussagen haben als oben gezeigt, und der Code ist zu lang.

Gibt es eine intelligentere Lösung, so dass ich nicht so viele iffelse-Statements schreiben muss? Jede ifelse-Anweisung bezieht sich auf eine eindeutige Liste wie oben, mit unterschiedlichen Längen, aus denen ich Beispiele zeichne.

+0

'Karte (function (l, x) Beispiel (l [[x]]), Liste (my.list), x) '? Ich bin mir nicht sicher, warum Sie deshalb nur einen Vektor der Länge 15 bekommen. Das scheint wirklich merkwürdig, wenn man bedenkt, dass Sie eine Stichprobe in gleicher Länge von jeder "my.list" -Liste nehmen. – thelatemail

+2

'ifelse' gibt nur einzelne Werte für jeden Vergleich zurück, so dass Sie möglicherweise nicht das bekommen, was Sie erwarten -' ifelse (c (1,1,2) == 1, 1:10, 10: 1) 'zum Beispiel. – thelatemail

+2

Vielleicht verstehe ich nicht, was Sie möchten, dass diese Funktion zurückkehrt. Möchten Sie einen Vektor einzelner Draws aus Ihrer Liste oder eine Liste voller Resamples aus Ihrer Liste? –

Antwort

0

Diese doppelte Verwendung von x verwirrte mich ein wenig. Wenn ich Sie richtig verstehe,

my.function <- function(x) { 
    sample(my.list[[1]],size = 1,replace = T) 
} 

sollte Ihnen geben, was Sie wollen.

0

Edited

Um die Merkwürdigkeiten von ifelse() zu vermeiden, die darauf @thelatemail und Vertrauen auf die globale Umwelt zu vermeiden, würde ich vorschlagen

my.list<-list(a=c(55,17,18,18,18,21), b=c(11,17,17,17,22,18,22), c=c(55,17,22,22,22,22,22,21,30))  

x<-c(1,1,1,1,2,2,3,3,3,3,3,3,3,3,3)  

set.seed(1)  

my.function <- function(x, list) { 
    sample(list[[x]], replace = T) 
}   

p<-sapply(x, my.function, list=my.list) 
Verwandte Themen