【问题标题】:Dplyr variable names in function R函数R中的Dplyr变量名称
【发布时间】:2022-01-13 11:47:10
【问题描述】:

我正在尝试使用一些 dplyr 函数创建一个函数,但我认为我遇到了 NSE 问题。当我在参数中使用变量的实际名称时,以下函数有效,但当我尝试调用我创建的向量的元素时,它不起作用。

我认为我需要对参数的引用/取消引用做一些事情,但我有点难过:

作品:

 dat1 <- read.table(text = "x1 x2 y
10 20 50
20 30.5 100
30 40.5 200
40 20.12 400
50 25 500
70 86 600
80 75 700
90 45 800", header = TRUE)
 
 num_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]))
 bin_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]), "bin", sep = "_")
 dat1[bin_names] <- lapply(dat1[num_names], function(x) dplyr::ntile(x, n = 10))
 
 
 make_iv <- function(df, variable, bin_variable){
   
   
   df <- df
   ivv <- df %>%
     group_by({{bin_variable}}) %>%
     summarise(N_ = n(),
               min_x = min({{variable}}),
               max_x = max({{variable}}),
               SumY = sum(y),
               perc_obs = (n()/nrow(df)),
               ans = sum(perc_obs))
   
  
   return(ivv)
 }
 
 
 make_iv(df = dat1,
         variable = x1,
         bin_variable = x1_bin)

不起作用:

 dat1 <- read.table(text = "x1 x2 y
10 20 50
20 30.5 100
30 40.5 200
40 20.12 400
50 25 500
70 86 600
80 75 700
90 45 800", header = TRUE)
 
 num_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]))
 bin_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]), "bin", sep = "_")
 dat1[bin_names] <- lapply(dat1[num_names], function(x) dplyr::ntile(x, n = 10))
 
 
 make_iv <- function(df, variable, bin_variable){
   
   
   df <- df
   ivv <- df %>%
     group_by({{bin_variable}}) %>%
     summarise(N_ = n(),
               min_x = min({{variable}}),
               max_x = max({{variable}}),
               SumY = sum(y),
               perc_obs = (n()/nrow(df)),
               ans = sum(perc_obs))
   
  
   return(ivv)
 }
 
 
 make_iv(df = dat1,
         variable = num_names[1],
         bin_variable = bin_names[1])

【问题讨论】:

    标签: r function dplyr


    【解决方案1】:

    您需要区分变量名称是符号(不确定这是否是好词)还是字符串。 NSE 指的是符号,即您不写引号。在您的第一个示例中,您在第二个 - 字符串中使用符号。对于字符串,另一种语法是必要的。你需要使用.data[[variable]],而不是{{variable}}

    library(dplyr)
    
    dat1 <- read.table(text = "x1 x2 y
    10 20 50
    20 30.5 100
    30 40.5 200
    40 20.12 400
    50 25 500
    70 86 600
    80 75 700
    90 45 800", header = TRUE)
    
    num_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]))
    bin_names <- paste(colnames(dat1[sapply(dat1, is.numeric)]), "bin", sep = "_")
    dat1[bin_names] <- lapply(dat1[num_names], function(x) dplyr::ntile(x, n = 10))
    
    
    make_iv <- function(df, variable, bin_variable){
      
      
      df <- df
      ivv <- df %>%
        group_by(.data[[bin_variable]]) %>%
        summarise(N_ = n(),
                  min_x = min(.data[[variable]]),
                  max_x = max(.data[[variable]]),
                  SumY = sum(y),
                  perc_obs = (n()/nrow(df)),
                  ans = sum(perc_obs))
      
      
      return(ivv)
    }
    
    
    make_iv(df = dat1,
            variable = num_names[1],
            bin_variable = bin_names[1])
    
    

    如果你还没有看到,这里有一个来源:Programming with dplyr

    【讨论】:

      猜你喜欢
      • 2021-07-21
      • 2017-03-18
      • 1970-01-01
      • 2019-07-30
      • 2018-09-22
      • 2015-08-03
      • 1970-01-01
      • 2014-08-25
      • 2017-12-18
      相关资源
      最近更新 更多