函数R中的Dplyr变量名称

Posted

技术标签:

【中文标题】函数R中的Dplyr变量名称【英文标题】:Dplyr variable names in function R 【发布时间】: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])

【问题讨论】:

【参考方案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

【讨论】:

以上是关于函数R中的Dplyr变量名称的主要内容,如果未能解决你的问题,请参考以下文章

将变量名称的向量传递给 dplyr 中的arrange()

R dplyr:使用字符串函数重命名变量

在 dplyr 的函数中使用变量名

根据向量new_varname,old_varname重命名dplyr中的变量名[重复]

使用 dplyr 重命名未命名的变量

R dplyr:: 使用字符串变量重命名和选择