Dplyr 编写一个以列名作为输入的函数
Dplyr write a function with column names as inputs
我正在编写一个将在 dplyr 中的多个列上使用的函数,但我无法将列名作为输入传递给 dplyr 的函数。
这是我想做的一个例子:
df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))
example<-function(colname){
df %>%
group_by(group)%>%
summarize(output=mean(sqrt(colname)))%>%
select(output)
}
example("var1")
输出应该类似于
df %>%
group_by(group)%>%
summarize(output=mean(sqrt(var1)))%>%
select(output)
我发现了一些类似的问题,但没有任何问题可以直接应用于我的问题,因此非常感谢您的帮助。我已经尝试了一些涉及 eval 的解决方案,但老实说我不知道我应该传递给 eval 的到底是什么。
这是您所期望的吗?
df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))
example<-function(colname){
df %>%
group_by(group)%>%
summarize(output=mean(sqrt(colname)))%>%
select(output)
}
example( quote(var1) )
#-----
Source: local data frame [2 x 1]
output
1 7.185935
2 8.090866
已接受的答案在 R 3.6 / dplyr 0.8 中不再有效。
按照建议,可以使用!!as.name()
这对我有用:
df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))
example<-function(colname){
df %>%
group_by(group)%>%
summarize(output=mean(sqrt(!!as.name(colname)))%>%
select(output)
}
example( quote(var1) )
如果另外想要在 mutate
中分配列名,那么最简单的方法是使用赋值 :=
。例如,将 colname 替换为其平方根。
example_mutate<-function(colname){
df %>%
mutate(!!colname := sqrt(!!as.name(colname)))
}
example_mutate( quote(var1) )
quote()
当然可以换成引号""
.
我正在编写一个将在 dplyr 中的多个列上使用的函数,但我无法将列名作为输入传递给 dplyr 的函数。
这是我想做的一个例子:
df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))
example<-function(colname){
df %>%
group_by(group)%>%
summarize(output=mean(sqrt(colname)))%>%
select(output)
}
example("var1")
输出应该类似于
df %>%
group_by(group)%>%
summarize(output=mean(sqrt(var1)))%>%
select(output)
我发现了一些类似的问题,但没有任何问题可以直接应用于我的问题,因此非常感谢您的帮助。我已经尝试了一些涉及 eval 的解决方案,但老实说我不知道我应该传递给 eval 的到底是什么。
这是您所期望的吗?
df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))
example<-function(colname){
df %>%
group_by(group)%>%
summarize(output=mean(sqrt(colname)))%>%
select(output)
}
example( quote(var1) )
#-----
Source: local data frame [2 x 1]
output
1 7.185935
2 8.090866
已接受的答案在 R 3.6 / dplyr 0.8 中不再有效。
按照建议!!as.name()
这对我有用:
df<-tbl_df(data.frame(group=rep(c("A", "B"), each=3), var1=sample(1:100, 6), var2=sample(1:100, 6)))
example<-function(colname){
df %>%
group_by(group)%>%
summarize(output=mean(sqrt(!!as.name(colname)))%>%
select(output)
}
example( quote(var1) )
如果另外想要在 mutate
中分配列名,那么最简单的方法是使用赋值 :=
。例如,将 colname 替换为其平方根。
example_mutate<-function(colname){
df %>%
mutate(!!colname := sqrt(!!as.name(colname)))
}
example_mutate( quote(var1) )
quote()
当然可以换成引号""
.