2012-08-03 13 views
10
ile Reduce/do.call kullanarak

Bu sadece bir meraktır (Küçült hakkında daha fazla bilgi edinerek). Yaptığım şeyi başarmak için daha iyi yöntemler var ve onlarla ilgilenmiyorum. Bazı insanlar, bir şeyi geri yüklemek/aramak için bir dizi iç içe geçmiş ifelse komutunu kullanır. Belki şuna benzer:ifrelse

set.seed(10); x <- sample(letters[1:10], 300, T) 
ifelse(x=="a", 1, 
    ifelse(x=="b", 2, 
    ifelse(x=="c", 3, 
    ifelse(x=="d", 4, 5)))) 

kadar etkileyici biraz işin yapılması için ifelse ile do.call veya Reduce ya kullanmak için bir yolu var mı?

+3

Harika bir soru. Tabii ki, pratikte, bir şey gibi (x, function (x) switch (x, a = 1, b = 2, c = 3, d = 4, 5) muhtemelen temiz. –

+0

@Richie Teşekkürler. d aslında ortamları kullanarak bir tabloya ya da "match" ile standart indekslemeye yaklaşıyor ancak bu soruna "Reduce" ya da "do.call" uygulanıp uygulanamayacağını görmek istedim. –

+0

As: 'match (x, letters) [1: 4], nomatch = 5) ' –

cevap

3

bu deneyin:

İşte
> library(gsubfn) 
> strapply(x, ".", list(a = 1, b = 2, c = 3, d = 4, 5), simplify = TRUE) 
    [1] 5 4 5 5 1 3 3 3 5 5 5 5 2 5 4 5 1 3 4 5 5 5 5 4 5 5 5 3 5 4 5 1 2 5 5 5 5 
[38] 5 5 5 3 3 1 5 3 2 1 5 2 5 4 5 3 5 2 5 5 5 4 5 1 2 5 4 5 5 5 5 1 3 1 5 5 5 
[75] 1 5 4 5 3 3 5 5 3 5 3 1 5 3 2 2 5 5 5 5 4 5 3 5 5 1 4 1 4 5 5 5 5 5 5 5 5 
[112] 5 2 5 5 5 3 5 5 5 2 4 4 5 3 3 5 4 5 5 5 1 5 3 4 3 5 5 2 5 5 3 1 5 2 5 5 5 
[149] 1 5 5 2 1 2 4 2 2 3 5 2 5 5 5 5 5 3 5 5 5 5 5 5 5 5 5 5 2 3 5 4 4 2 5 5 5 
[186] 5 5 5 5 2 1 1 1 5 5 5 5 3 5 5 3 5 5 5 2 5 5 5 3 5 5 5 5 5 1 5 5 5 5 2 2 5 
[223] 5 5 4 3 4 5 5 4 5 5 5 3 5 3 5 5 5 5 4 5 5 1 5 5 2 5 5 5 2 5 5 3 2 5 4 5 2 
[260] 5 5 3 5 5 1 4 3 5 4 5 2 5 5 3 5 5 5 5 5 1 1 5 2 5 1 5 5 5 5 5 5 5 5 5 5 5 
[297] 5 1 5 2 
+1

Bir ifelse' görmüyorum ve bir "do.call" veya "Azalt" fonksiyonu her yerde :) –

+5

'make.call <- strapply' işlevini deneyin ve ardından yukarıdaki' do.call 'ile yukarıdakileri tekrarlayın. strapply'. –

+0

Bu gerçekten işe yarıyor :) –

0

bir girişimdir. Ne güzel ne de ne ifelse: if (o):

f <- function(w,s) { 
    if(is.null(s$old)) 
    w$output[is.na(w$output)] <- s$new 
    else 
    w$output[w$input==s$old] <- s$new 
    return(w) 
} 

set.seed(10); x <- sample(letters[1:10], 300, T) 

subst <- list(
    list(old="a", new=1), 
    list(old="b", new=2), 
    list(old="c", new=3), 
    list(old="d", new=4), 
    list(old=NULL, new=5) 
) 
workplace <- list(
    input=x, 
    output=rep(NA, length(x)) 
) 

Reduce(f, subst, workplace)