2

ハドレーバースを使ってプログラミングする方法を学ぶのに苦労しています。NSEと怠惰なビネットを読みましたが、まだ迷っています...

tidyr::complete ヘルプ ページにある例を SE ケースに翻訳しようとしています。

df <- data_frame(
  group = c(1:2, 1),
  item_id = c(1:2, 2),
  item_name = c("a", "b", "b"),
  value1 = 1:3,
  value2 = 4:6
)
df %>% complete(group, nesting(item_id, item_name))

私の最終的な目標は、次のように指定された変数で同じことを実行できるようにすることです。

v1 <- 'group'
v2 <- 'item_id, item_name'

しかし、それを試す前に、列名を直接使用して解決できるようにする必要があります。始めるには、それが私が望むものではないことを知っていても、これは少なくともエラーをスローしません:

df %>% complete_(list(~group, ~item_id, ~item_name))

私が理解できないのは、「nesting_」を含める方法
です。

df %>% complete_(~group, nesting_(~item_id, ~item_name)) 
# Error in nesting_(~item_id, ~item_name) : unused argument (~item_name)

df %>% complete_(~group, nesting_(list(~item_id, ~item_name)))
# Error: Each variable must be named. 
# Problem variables: 1, 2 

df %>% complete_(~group, nesting_(alist(~item_id, ~item_name)))
# Error: Each variable must be named. 
# Problem variables: 1, 2 

df %>% complete_(~group, nesting_(list('item_id' = item_id, 'item_name' = item_name)))
# Error in stopifnot(is.list(x)) : object 'item_id' not found

df %>% complete_(~group, nesting_(list('item_id' = df$item_id, 'item_name' = df$item_name)))
# No syntax error, but doesn't expand...

df %>% complete_(~group, nesting_(named_dots(item_id, item_name)))
# Error: Each variable must be a 1d atomic vector or list.
# Problem variables: 'item_id', 'item_name'

df %>% complete_(~group, nesting_(list('item_id' = item_id, 'item_name' = item_name)))
# Error in stopifnot(is.list(x)) : object 'item_id' not found

df %>% complete_(~group, nesting_(list(as.name(item_id), as.name(item_name))))
# Error in as.name(item_id) : object 'item_id' not found

df %>% complete_(~group, nesting_(as.name(item_id), as.name(item_name)))
# Error in nesting_(as.name(item_id), as.name(item_name)) : 
#   unused argument (as.name(item_name))

助けてくれてありがとう!!

4

3 に答える 3

2

@aosmith の提案のおかげで、この回避策をハックしました。
おそらく最善/正しい方法ではありませんが、うまくいくようです。

機能する彼の最後のステートメントから始めます。

v1 <- 'group'
v2 <- c("item_id", "item_name")
df %>% complete_(list(as.name(v1), ~nesting_(setNames(list(item_id, item_name), v2))))

setNames 呼び出しをいじって、それが何をしたかを確認しました。

setNames(list(df$item_id, df$item_name), v2)
$item_id
[1] 1 2 2

$item_name
[1] "a" "b" "b"

そして、v2 で名前が付けられた df 列をサブセット化しているだけであることに気付きました。だから私はselect_を介して同じことをやろうとしました:

df %>% complete_(list(as.name(v1), ~nesting_(select_(., .dots = v2))))
# A tibble: 4 × 5
  group item_id item_name value1 value2
  <dbl>   <dbl>     <chr>  <int>  <int>
1     1       1         a      1      4
2     1       2         b      3      6
3     2       1         a     NA     NA
4     2       2         b      2      5
于 2016-11-07T17:10:29.210 に答える