【问题标题】:lapply returns series of vectors and not a single onelapply 返回一系列向量而不是单个向量
【发布时间】:2015-08-03 04:00:29
【问题描述】:

我编写了一个函数,可以将字符输入转换为数字输出。

votedIndicated <- function(votedCode) {
  switch(votedCode,
         "V" = 1,
         "A" = 1,
         "M" = 1,
         "O" = 1,
         "T" = 1,
         "P" = 1,
         "L" = 1,
         "D" = 0)
}

当我运行它时,我得到了预期的回报:

> votedIndicated("V")
[1] 1
> votedIndicated("D")
[1] 0

但是,当我尝试将此函数应用于向量时,我得到的不是另一个向量,而是一系列单值向量(我想我说的没错)

> foo <- c("V","V","D")
> bar <- lapply(foo, votedIndicated)
> bar
[[1]]
[1] 1

[[2]]
[1] 1

[[3]]
[1] 0

我怎样才能制作这样的酒吧bar &lt;- c(1,1,0)

【问题讨论】:

  • Vectorize(votedIndicated)(c("V","V","D"))
  • 你完全可以在没有函数的情况下做到这一点。只需制作一个查找向量。 vcode &lt;- c("V"=1,"A"=1,"M"=1,"O"=1,"T"=1,"P"= 1,"L"= 1,"D"=0); vcode[foo]
  • sapply(foo, votedIndicated)

标签: r


【解决方案1】:

您所指的“单值向量系列”在 R 中称为 列表。列表也是一个向量,但您希望返回一个 原子 矢量。为此,由于您知道返回值始终是单个数值,您可以使用vapply()

vapply(foo, votedIndicated, 1)
# V V D 
# 1 1 0 

或者如果你不想要这些名字,

vapply(foo, votedIndicated, 1, USE.NAMES = FALSE)
# [1] 1 1 0

有关vapply() 的更多信息,请参阅help(vapply)

【讨论】:

    【解决方案2】:

    只要保留你已经拥有的。

    as.vector(do.call(rbind,bar))
    

    给予:

    [1] 1 1 0
    

    【讨论】:

    • unlist(bar) 似乎更容易
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2022-10-14
    • 2012-10-24
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多