0

考慮すべきいくつかのサンプル 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 関数を介してルックアップ テーブル (連想配列/リスト) に基づいて新しい変数 (NewX2、Newy2) を追加したいということです。

コードを DRY に保つ方法はありますか? 特にここ:

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

よくわからないsapply、またはlapply助けることができますか?または、ここ%=%に見られるようなものかもしれません。

私はこのようなことをしたいです...(うまくいけば、これは理にかなっています):

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

1 に答える 1

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
于 2014-09-16T14:28:19.997 に答える