【问题标题】:R dplyr: join within pipeR dplyr:在管道内连接
【发布时间】:2018-11-18 00:58:38
【问题描述】:

我对 dplyr 完全陌生,正在尝试使用 dplyr 执行以下操作:

我有数据框“tdata”,并希望在每个组中用“NA”填充省略的句点 (prd)。我想获得数据框的“结果”。速度对我来说很重要,所以我希望有一种方法可以在 dplyr 中比在 for 循环中更快地做到这一点。

> tdata <- data.frame(group = c(10, 10, 10, 11, 11), prd = c(1, 2, 5, 3, 5), value = c(2,7,3,6,2))
> tdata
  group prd value
1    10   1     2
2    10   2     7
3    10   5     3
4    11   3     6
5    11   5     2
> result <- data.frame(group = c(10, 10, 10, 10, 10, 11, 11, 11), prd = c(1, 2, 3, 4, 5, 3, 4, 5), value = c(2, 7, 'NA', 'NA', 3, 6, 'NA', 2))
> result
  group prd value
1    10   1     2
2    10   2     7
3    10   3    NA
4    10   4    NA
5    10   5     3
6    11   3     6
7    11   4    NA
8    11   5     2

我尝试使用管道并收到此错误:

> fdata <- tdata %>%
+   group_by(group) %>%
+   arrange(prd) %>%
+   left_join(data.frame(prd_v=min(prd):max(prd)), ., by=c("prd_v" = "prd"))
Error in data.frame(prd_v = min(prd):max(prd)) : object 'prd' not found

更新: 另外,我想在更大的函数中使用这个管道,所以我想有

period_variable <- "prd"

然后

tdata2 <- ndata %>%
  group_by(group) %>%
  complete(period_variable = full_seq(period_variable), period = 1) %>%
  ungroup()
tdata2

但它不起作用。我尝试使用 get()、parse()、eval()、as.name()、as.symbol()、UQ()、!!、sym(),但它仍然不起作用。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用tidyr 包中的complete 函数。

    library(dplyr)
    library(tidyr)
    
    tdata2 <- tdata %>%
      group_by(group) %>%
      complete(prd = full_seq(prd, period = 1)) %>%
      ungroup()
    tdata2
    # # A tibble: 8 x 3
    #   group   prd value
    #   <dbl> <dbl> <dbl>
    # 1    10     1     2
    # 2    10     2     7
    # 3    10     3    NA
    # 4    10     4    NA
    # 5    10     5     3
    # 6    11     3     6
    # 7    11     4    NA
    # 8    11     5     2
    

    【讨论】:

    • 谢谢!当 period_variable 在管道代码之外定义时,您知道该怎么做吗?我更新了问题。
    • @MoyseyAbramowitz 我不知道。它与函数式编程有关。请看这个dplyr.tidyverse.org/articles/programming.html
    【解决方案2】:

    至于第二个问题,我不知道这是否是你想要的,但我会这样做:

    prd = c(1, 2, 5, 3, 5)
    period_variable <- quote(prd)
    
    tdata2 <- tdata %>%
    dplyr::group_by(group) %>%
    tidyr::complete(prd= tidyr::full_seq(eval(period_variable), period = 1)) %>%
    dplyr::ungroup()
    

    【讨论】:

    • 此代码产生错误: eval(period_variable) 中的错误:找不到对象'prd'。
    • 您提到 period_variable 是在管道代码之外定义的(我编辑了我的回复),所以我知道 prd 是在 data.frame 之外创建的。如果这不是你想要的,你可以更明确。
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2013-07-30
    • 2016-05-22
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多