2017-06-05 179 views
-1

條件語句,我有以下數據:太多ifelse語句

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)  

在「真實」數據集我有更多的ifelse語句比上面顯示,代碼太長。

是否有更智能的解決方案,因此我不需要編寫如此多的ifelse語句?每個ifelse語句都與上面的一個唯一列表有關,我用不同的長度繪製樣本。

+0

'地圖(函數(L,X)樣本(l [[x]],列表(my.list),x)'?我不確定爲什麼你只能得到長度爲15的矢量。考慮到每個'my.list'列表的長度相同,這似乎很奇怪。 – thelatemail

+2

'ifelse'只爲每次比較返回單個值,所以你可能沒有得到你期望的結果 - 例如'ifelse(c(1,1,2)== 1,1:10,10:1)'。 – thelatemail

+2

也許我不明白你想要這個函數返回什麼。你想從你的列表中獲得單張抽獎的矢量,還是從你的列表中獲得完整抽樣的列表? –

回答

0

那兩次使用x讓我困惑了一下。如果我理解正確,

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

應該給你你想要的。

0

編輯

爲了避免@thelatemail指出,避免對全球環境的依賴ifelse()的怪事,我會建議

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)