2012-08-03 100 views
10

這純粹是一種好奇心(瞭解更多關於Reduce)。有更好的方法來實現我正在做的事情,我對它們不感興趣。使用Reduce/do.call與ifelse

有些人使用一系列嵌套的ifelse命令來重新編碼/查找某些內容。也許它看起來像這樣:

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)))) 

有沒有爲使用do.callReduceifelse來完成多一點雄辯地工作的方法嗎?

+3

好問題。當然,在實踐中,像sapply(x,function(x)switch(x,a = 1,b = 2,c = 3,d = 4,5)這樣的東西可能是最乾淨的。 – 2012-08-03 15:23:57

+0

@Richie謝謝。 d實際上是通過使用環境或使用'match'的標準索引來查找表,但我想知道'Reduce'還是'do.call'可以應用於這個問題。 – 2012-08-03 15:29:37

+0

如:match(x,letters [1:4],nomatch = 5)' – 2012-08-03 17:18:29

回答

3

試試這個:

> 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

我沒有看到'ifelse'和一個'do.call'或'Reduce'函數:) – 2012-08-03 17:02:14

+5

嘗試'do.call < - strapply',然後用'do.call'代替' strapply'。 – 2012-08-03 17:17:27

+0

這確實有效:) – 2012-08-03 17:20:35

0

這是一種嘗試。它既不美觀也不會使用ifelse:

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)