【问题标题】:Create a dplyr-based functions创建基于 dplyr 的函数
【发布时间】:2017-08-03 02:34:48
【问题描述】:

我正在考虑基于 dplyr 包创建函数。我见过几个例子,比如 janitor package 和 Organism.dplyr。但是,我不知道我可以扩展或固有 dplyr 功能,或者即使有可能。

例如。我想要什么:

数据 %>% group_by(columnX) %>% my_mutate_like_function()

但是,它不起作用,我看到一篇关于它的帖子,使用 do() 作为替代方法... 但是,这不是我想要的。

谁能帮帮我?谢谢。

== 遵循代码示例(已编辑)==

data <- data.frame(groupname = c('A', 'B', 'A', 'A', 'B', 'B'), 
                   value = c(1, 3, 4, 2, 1.4, 5))

my_mutate_like_function <- function(data) {
  data$category <- ifelse(data$value <= mean(data$value), 'In', 'Out')
  data$meanvalue <- mean(data$value)
  data
}

data_works <- data %>% group_by(groupname) %>% 
  mutate(category = ifelse(value <= mean(value), 'In', 'Out'), meanvalue = mean(value)) 
# That's the right output, each "groupname" had their average calculated and it was used a threshold value

data_fails <- data %>% group_by(groupname) %>% 
  my_mutate_like_function() 
# The group_by properties seems not work inside my function

【问题讨论】:

  • 您能否展示无法与数据样本和预期输出一起工作的代码?
  • 我添加了一个代码示例。
  • 对不起,如果这是一个愚蠢的评论,但是在你的函数中使用 dplyr 怎么样,即一个包装器?还是你想在你的函数中使用“baseR 方法”?
  • 如果理解您的建议,这就像在我的函数中写一个“dplyr::mutate”。是吗?所以,实际上,我正在以这种方式编码......但是,问题是,即使像这样编码,函数仍然没有“扩展” dplyr::group_by 行为。你能给我一个关于你的建议的代码 sn-p 吗?

标签: r dplyr


【解决方案1】:

根据这个问题dplyr::mutate to add multiple values,没有优雅的方法可以在 dplyr 的一个函数中获取两个返回值。为了使用 group_by,我只有在将函数包装在 mutate() 中时才设法让它工作,这是有道理的,因为 mutate 会在将值传递给新函数之前正确处理分组。我添加了一个以使其可见。

print(mean(value))

所以一个可能的解决方案是:

my_mutate_like_function1 <- function(value) {

    ifelse(value <= mean(value), 'In', 'Out')
}


my_mutate_like_function2 <- function(value) {
    print(mean(value))
    mean(value)
}


data %>% group_by(groupname) %>% 
    mutate(category=my_mutate_like_function1(value),meanvalue=my_mutate_like_function2(value)) 

【讨论】:

    【解决方案2】:

    rstudio 网站上有很好的指南:https://dplyr.tidyverse.org/articles/programming.html

    你的更简单,但它们可能会变得更棘手,你可能需要准引用。

    这似乎可行。

    library(tidyverse)
    library(rlang)
    
    data <- data.frame(groupname = c('A', 'B', 'A', 'A', 'B', 'B'), 
                   value = c(1, 3, 4, 2, 1.4, 5))
    data <-as.tibble(data)
    data
    
    my_mutate_like_function <- function(data) {
      data <- data %>%  mutate(mean.val = mean(value)) %>% 
      mutate (category = ifelse(value <= mean.val, "in", "out"))
      data
    }
    
    new.df <- my_mutate_like_function(data)
    new.df
    

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2019-07-08
      • 2016-11-10
      • 2018-01-03
      相关资源
      最近更新 更多