簡體   English   中英

在SE情況下如何使用nesting_

[英]How to use nesting_ in SE case

我正在努力學習如何使用hadleyverse進行編程。 我讀過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))

謝謝你的幫助!!

感謝@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

我有complete_nesting_可以像這樣一起工作:

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

查看nesting_的代碼,看來命名列表來自tibble::as_data_frame的使用。

但是,上面的代碼在實際開始使用命名變量時並沒有太大幫助。 事情仍然可以complete_ _ OK:

df %>% complete_(list(as.name(v1), ~nesting_(list(item_id = item_id, item_name = item_name))))

您可以通過setNames和名稱的向量nesting_的命名列表:

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

但是我沒有找到使用nesting_的名稱列表的解決方案。 我的失敗涉及諸如

df %>% complete_(list(as.name(v1), ~nesting_(setNames(lapply(v2, as.name), v2))))

錯誤:每個變量必須是一維原子向量或列表。 問題變量:“ item_id”,“ item_name”

除此之外,我沒有做太多嘗試,但這可能會為您提供一個起點。

另一種可能性是:

v1 <- 'group'
v2 <- c('item_id', 'item_name')
df %>% complete_(c(v1, ~do.call(nesting, lapply(v2, as.name))))

  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

這不使用“ SE” nesting_() ,而是利用了可以懶惰地評估要完成的參數這一事實。 我不認為這比上面ap53的答案更可取,但確實刪除了select()的顯式使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM