【问题标题】:How to define R functions with mutate_(), paste(), and varnames如何使用 mutate_()、paste() 和 varnames 定义 R 函数
【发布时间】:2019-07-29 21:56:59
【问题描述】:

我正在尝试创建一个函数来优化我的代码。 我有以下格式的小标题。我想添加标题为“AGG_range”的第 5 列也是最后一列。

>data.temp0 
  AGG_median AGG_mean AGG_min AGG_max
       <dbl>    <dbl>   <dbl>   <dbl>
1       38       40.7      29      52
2       49       49        21      83
3       30       39        10      75
4       38       38.9      13      59
5       63.5     57.4      15      82
6       32       33        21      50
7       39       40.5      14      75

我尝试过使用 mutate(!!varname = paste(!!varname2,!!varname3,sep="-") 和 mutate_(somename = paste(varname2,varna,sep="-"))

但是我得到的结果不是我想要的。

我正在做的一个简单示例如下:

myfuntemp  = function(chr_temp){
  chr_temp.range = chr_temp %>%
    paste("range",sep="_")
  chr_temp.min = chr_temp %>%
    paste("min",sep="_")
  chr_temp.max = chr_temp %>%
    paste("max",sep="_")
  dat_temp = data.temp0 %>%
    mutate_(chr_temp.range = paste("(",as.character(chr_temp.min),"-",
                                   as.character(chr_temp.max),")",sep="")) %>%

    rename (!!chr_temp.range:= chr_temp.range)

  return(dat_temp)

}

以下是我得到的(实际输出)

>myfuntemp('AGG')

  AGG_median AGG_mean AGG_min AGG_max AGG_range
       <dbl>    <dbl>   <dbl>   <dbl>     <dbl>
1       38       40.7      29      52       -23
2       49       49        21      83       -62
3       30       39        10      75       -65
4       38       38.9      13      59       -46
5       63.5     57.4      15      82       -67
6       32       33        21      50       -29
7       39       40.5      14      75       -61

但是,以下是我想要的(预期输出)

  AGG_median AGG_mean AGG_min AGG_max AGG_range 
       <dbl>    <dbl>   <dbl>   <dbl> <chr>    
1       38       40.7      29      52 (29-52)  
2       49       49        21      83 (21-83)  
3       30       39        10      75 (10-75)  
4       38       38.9      13      59 (13-59)  
5       63.5     57.4      15      82 (15-82)  
6       32       33        21      50 (21-50)  
7       39       40.5      14      75 (14-75)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    df <- data.frame(min=sample(c(1:5),5,T),mean=sample(c(10:20),5,T),max=sample(c(25:35),5,T))
    
    myfun <- function(data){
      data <- data %>% mutate(range=paste0('(',min,' - ',max,')'))
      return(data)
    }
    
    myfun(df)
    
      min mean max    range
    1   3   14  35 (3 - 35)
    2   3   13  29 (3 - 29)
    3   2   15  27 (2 - 27)
    4   2   18  35 (2 - 35)
    5   3   19  33 (3 - 33)
    

    更新
    此函数将重命名变量以及创建范围变量。

    myfun2 <- function(data,newname='AGG'){
      data <- data %>% mutate(range=paste0('(',min,' - ',max,')'))
      names(data) <- paste0(newname,'_',names(data))
      return(data)
    }
    
    myfun2(df,'AGG')
      AGG_min AGG_mean AGG_max AGG_range
    1       3       14      35  (3 - 35)
    2       3       13      29  (3 - 29)
    3       2       15      27  (2 - 27)
    4       2       18      35  (2 - 35)
    5       3       19      33  (3 - 33)
    

    【讨论】:

    • 这很有帮助,谢谢。但是,我真正想做的是将“min”和“max”称为唯一变量名,就像在我的示例函数中一样。我的问题可能不是最有效的方法,但我很好奇解决方案是什么。
    • 好的,我已经更新了帖子。这更接近您正在寻找的东西吗?正如您所说,由于您的原始数据与您的预期输出非常匹配,因此尚不清楚。
    • 这实际上是一个更简单的解决方案,谢谢。我把它复杂化了。我仍在尝试学习如何在这样的函数中调用变量名。你知道我是如何让我的代码工作的吗?
    • 如果没有看到更多代码,很难说。但看起来你的函数正在调用data.temp0,它没有在其中定义。而chr_temp %&gt;% paste("range",sep="_") 将不能作为dplyr 调用。
    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多