应用函数并在R中的单个调用中分配多个变量

时间:2014-09-16 13:43:35

标签: r lapply sapply mapply

要考虑的一些示例R代码:

df = data.frame(x=letters[1:4], y=letters[5:8])

find.key <- function(x, li, default=NA) {
  ret <- rep.int(default, length(x))
  for (key in names(li)) {
    ret[x %in% li[[key]]] <- key
  }
  return(ret)
}

x2 = list("Alpha" = "a", 
          "Beta"  = "b", 
          "Other" = c("c","d"))

y2 = list("Epi"    = "e", 
          "OtherY" = c("f", "g", "h"))

# This is the code in question, imagine many variables and calls to find.key()
df$NewX2 = find.key(df$x, x2)
df$Newy2 = find.key(df$y, y2)

# df
#   x y NewX2  Newy2
# 1 a e Alpha    Epi
# 2 b f  Beta OtherY
# 3 c g Other OtherY
# 4 d h Other OtherY

因此,我想要通过find.key function基于查找表(关联数组/列表)添加新变量(NewX2,Newy2)。

有没有办法保持我的代码干?具体来说:

df$NewX2 = find.key(df$x, x2)
df$Newy2 = find.key(df$y, y2)

我不确定sapplylapply能提供帮助吗?或者像%=%那样c(df$NewX2, df$Newy2) = find.key(c(df$x, df$y), c(x2, y2))

我喜欢这样的事情......(希望这是有道理的):

{{1}}

1 个答案:

答案 0 :(得分:3)

对左侧data​​.frame而不是[提取使用$提取:

df[,c('NewX2','NewY2')] <- mapply(find.key, 
                                  list(df$x, df$y), 
                                  list(x2, y2), 
                                  SIMPLIFY=FALSE)
# df
#   x y NewX2  NewY2
# 1 a e Alpha    Epi
# 2 b f  Beta OtherY
# 3 c g Other OtherY
# 4 d h Other OtherY

或者,如果您不想写mapply,可以使用Vectorize,这将为您创建基于mapply的功能,以获得相同的结果:

find.keys <- Vectorize(find.key, c("x","li"), SIMPLIFY=FALSE)
df[,c('NewX2','NewY2')] <- find.keys(list(df$x, df$y), list(x2, y2))
df
#   x y NewX2  NewY2
# 1 a e Alpha    Epi
# 2 b f  Beta OtherY
# 3 c g Other OtherY
# 4 d h Other OtherY