数据如下
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)
需要在多个相似的数据帧上运行相似的操作,但是具有不同的列名,因此该函数很有意义。该函数使用dplyr
和ggplot
如下绘制两个变量的散点图。
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")
显然,此函数会引发错误,并且您可能会看到问题在于访问在函数调用中作为字符串传递的列名变量。
Error in round(colNameX, 0) :
non-numeric argument to mathematical function
建议使用什么方法来处理作为列名参数传递的字符串?寻找通用答案,因为它可能适用于多种情况。
更新:
@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"))
查看您的代码尚不清楚您要执行的操作,但是如果您想在函数中传递带引号的值,这可能会有所帮助。
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句