【问题标题】:Using tidyr complete() with column names specified in variables使用 tidyr complete() 并在变量中指定列名
【发布时间】:2017-03-27 10:12:56
【问题描述】:

我在使用带有列名作为变量的 tidyr::complete() 函数时遇到问题。

内置示例按预期工作:

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)) 

但是,当我尝试将列名作为字符串提供时,会产生错误。

gr="group"
id="item_id"
name="item_name"
df %>% complete_(gr, nesting_(id, name),fill = list(NA))

【问题讨论】:

  • 根据源码,nesting_ 只接受一个参数(一个列表)。
  • 不知道是不是应该扔箭?
  • @David Arenburg:当 fill = list(NA) 缺失时会这样
  • Welp,我知道tidyr 可以做一些事情,但是向你投掷箭是一个有趣的功能
  • 我已经做到了这一点,但还没有让complete_ 工作:df %&gt;% complete(group, nesting_(setNames(list(.[[id]], .[[name]]), c(id, name)))) 而且,它很丑。

标签: r tidyr


【解决方案1】:

我认为这是一个错误,complete_ 无法与 data.frames 或 complete 之类的列表列一起使用,但这里有一个解决方法,使用 unite_separate 来模拟 nesting

df %>% unite_('id_name', c(id, name)) %>% 
    complete_(c(gr, 'id_name')) %>% 
    separate(id_name, c(id, name))

## # A tibble: 4 × 5
##   group item_id item_name value1 value2
## * <dbl>   <chr>     <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

【讨论】:

  • 感谢您的回答@alistaire 这适用于小型数据帧。当我在大型对象上尝试该模式时,我收到一条警告消息:691968 个位置的值过多:...并且该函数未完成整个数据帧
  • 该错误通常是因为数据中已经存在其他分隔符,因此拆分次数过多。 separatesep 参数默认为任何非字母数字字符,但您可以通过添加sep = '_' 将其限制为unite 使用的分隔符(默认为_)。
  • 你是对的。在我的数据集中实际上就是这种情况。谢谢
【解决方案2】:

更简单一点,df %&gt;% complete(!!!syms(gr), nesting(!!!syms(id), !!!syms(name))) 现在可以在 tidyr 1.0.2 中完成

【讨论】:

    【解决方案3】:

    现在tidyr 采用了整洁的评估,下划线变体(即complete_)已被弃用,因为它们的行为可以由标准变体(complete)处理。

    但是,completecrossingnesting 使用数据屏蔽,因此将变量转换为名称的方法是通过 .data[[var]] 代词(每个 the docs),因此您的情况变为:

    suppressPackageStartupMessages(
      library(tidyr)
    )
    
    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
    )
    
    gr <- "group"
    id <- "item_id"
    name <- "item_name"
    
    df %>% complete(
      .data[[gr]],
      nesting(.data[[id]],
              .data[[name]])
    )
    #> # A tibble: 4 x 5
    #>   group item_id item_name value1 value2
    #>   <dbl>   <dbl> <fct>      <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
    

    reprex package (v0.3.0) 于 2020 年 2 月 28 日创建

    不是很优雅,但它可以完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2019-09-15
      相关资源
      最近更新 更多