【问题标题】:using Reduce/do.call with ifelse通过 ifelse 使用 Reduce/do.call
【发布时间】:2012-08-03 15:00:31
【问题描述】:

这纯粹是出于好奇(了解有关 Reduce 的更多信息)。有更好的方法来实现我正在做的事情,我对它们不感兴趣。

有些人使用一系列嵌套的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 一起使用来更有说服力地完成工作?

【问题讨论】:

  • 好问题。当然,在实践中,sapply(x, function(x) switch(x, a = 1, b = 2, c = 3, d = 4, 5 这样的东西可能是最干净的。
  • @Richie 谢谢。我实际上会通过使用环境的查找表或使用match 的标准索引来解决这个问题,但我想看看Reducedo.call 是否可以应用于这个问题。
  • 如:match(x, letters[1:4], nomatch=5)
  • 是的,就是这样。我认为Reduce 不在此列,但do.call 可能会以某种方式使用,如果您将所有内容都作为列表传递,也许。
  • 是的,看起来很像Reduce 应该可以工作,但从根本上说,它传递了三个输入而不是两个。可以将它与列表 [2] 的列表或其他东西组合在一起。

标签: r higher-order-functions


【解决方案1】:

试试这个:

> 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

【讨论】:

  • 我在任何地方都没有看到 ifelsedo.callReduce 函数 :)
  • 尝试do.call &lt;- strapply,然后用do.call代替strapply重复上述操作。
  • 我看到爱之夏已经让位于不满之秋 :-D
  • 当然还有dont.call &lt;- function() q("no")。 (注意:未成年人或不熟悉R的人请勿使用。)
【解决方案2】:

这是一个尝试。它既不美观也不使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多