繁体   English   中英

R - 访问 dataframe 列名称作为 function 参数中的字符串传递

[英]R - accessing dataframe column names passed as strings in function argument

数据如下

text = "
date,a,b
12/2/2019,18.1,0.017741935
12/2/2019,18.2,0.020967742
12/9/2019,16.7,0.020322581
12/9/2019,16.9,0.019677419
12/3/2019,18.1,0.017741935
12/3/2019,18.8,0.020967742
12/10/2019,16.2,0.020322581
12/10/2019,16.1,0.019677419
"
df1 = read.table(textConnection(text), sep=",", header = T)

需要在多个类似的数据帧上运行类似的操作,但列名不同,所以 function 是有意义的。 function 使用dplyrggplot对两个变量进行散点 plot ,如下所示。

dplyrGgFn = function(df, colNameX, colNameY) {

  # get average Y value for each x value point to be used
  df = df %>%
    select(colNameX, colNameY) %>%
    mutate(colNameX = round(colNameX,0)) %>%
    group_by(colNameX) %>%
    summarise(colNameY = mean(colNameY))

  # 
  return(
    ggplot(df, aes_string(x=colNameX, y=colNameY)) + 
      geom_point(aes(color = "blue"))
  )

}

并像dplyrGgFn(df1, "a", "b")

显然,这个 function 会引发错误,您可能会看到问题在于访问在 function 调用中作为字符串传递的列名变量。

Error in round(colNameX, 0) : 
  non-numeric argument to mathematical function 

处理作为列名的 arguments 传递的字符串的推荐方法是什么? 寻找通用答案,因为它可能适用于多种情况。

更新:

用户@Onyambu 评论说有一个非功能版本作为起点 - 添加。

df1 = df1 %>%
    select(a, b) %>%
    mutate(a = round(a,0)) %>%
    group_by(a) %>%
    summarise(b = mean(b))

ggplot(df1, aes(x=a, y=b)) + 
  geom_point(aes(color = "blue"))

我将 group_by(y) 更改为 group_by(x),这似乎是您打算做的。 否则,不清楚(如评论中所述)。

以下代码应该可以帮助您了解如何在函数中传递变量名称dplyr代码。

dplyrGgFn = function(df, colNameX, colNameY) {

  # get average Y value for each x value point to be used
  df = df %>%
    select(!!colNameX, !!colNameY) %>%
    mutate(!!colNameX := round(!!as.name(colNameX), 0)) %>%
    group_by(!!as.name(colNameX)) %>%
    summarise(!!colNameY := mean(!!as.name(colNameY)))
  # 
  return(
    ggplot(df, aes_string(x=colNameX, y=colNameY)) + 
      geom_point(aes(color = "blue"))
  )
}

查看您的代码尚不清楚您要做什么,但如果您想在 function 中传递引用的值,这可能会有所帮助。

library(dplyr)
library(rlang)
library(ggplot2)

dplyrGgFn = function(df, colNameX, colNameY) {
    x_col <- sym(colNameX)
    y_col <- sym(colNameY)
    df %>%
      group_by(!!x_col) %>%
      summarise(colNameY = mean(!!y_col)) %>%
      ggplot() + aes(!!x_col, y= !!y_col) + geom_point()
}

dplyrGgFn(df1, "a", "b")

请注意, aes_string已被弃用,取而代之的是sym ,并且aes(color = "blue")并没有按照您的预期执行。


要传递未引用的变量,请使用{{}}

dplyrGgFn = function(df, colNameX, colNameY) {
  df %>%
    group_by({{colNameX}}) %>%
    summarise(colNameY = mean({{colNameY}})) %>%
    ggplot() + aes({{colNameX}}, y= {{colNameY}}) + geom_point()
}

dplyrGgFn(df1, a, b)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM