【问题标题】:Apply a multivariate function over two lists在两个列表上应用多元函数
【发布时间】:2014-12-19 19:56:29
【问题描述】:

我有一个映射函数如下,

sub.func <- function(x,y){
  if(agrepl(x,y)){
    return(x)
  }
  else{
    return(y)
  }
}

现在我想应用它来比较两个不同大小的列表,比如myList1myList2,这样对于myList1 的每个元素,sub.func 将在myList2 中寻找匹配项,如果yes 将替换为 myList2 的元素。这样myList2 的所有元素都被映射到。如何在不使用循环的情况下实现这一点?可以使用 apply 函数的任何变体吗?

例如

myList1 <- c("a b", "c d", "e f")

myList2 <- c("1", "a b d", "d", "e f g h", "2 3 a c d", "c g")

所需的输出与 myList2 的长度相同,但尽可能映射到 myList1

output <- c("1", "a b", "d", "e f", "c d", "c g")

【问题讨论】:

  • 包含示例输入和所需输出以明确您想要什么并提供一种测试潜在解决方案的简单方法会很有帮助。见how to make a reproducible example
  • 这可能会触发警告并给出不正确的结果,因为agrepl 是一个矢量化函数。
  • 返回一个向量结果,我的意思是

标签: r apply tapply


【解决方案1】:

您可以为此使用Reduce 函数

myList1 <- c("a b", "c d", "e f")
myList2 <- c("1", "a b d", "d", "e f g h", "2 3 a c d", "c g")

Reduce(function(vals, find) {vals[grep(find, vals)]<-find; vals}, myList1, myList2)
# [1] "1"   "a b" "d"   "e f" "c d" "c g"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2016-07-21
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    相关资源
    最近更新 更多