【问题标题】:Create a new variable using dplyr::mutate and pasting two existing variables for user-defined function使用 dplyr::mutate 创建一个新变量,并为用户定义的函数粘贴两个现有变量
【发布时间】:2017-07-09 11:40:22
【问题描述】:

我想创建一个函数来连接数据框中置信区间的下限和上限(命名为CIlow 和CIhigh)。以下面的数据框为例。

dataframe<-data.frame(CIlow_a=c(1.1,1.2),CIlow_b=c(2.1,2.2),CIlow_c=c(3.1,3.2),
                      CIhigh_a=c(1.3,1.4),CIhigh_b=c(2.3,2.4),CIhigh_c=c(3.3,3.4))

对于多个组(命名为 a、b 和 c)和多个变量(在本例中为两个,即数据框)。

group<-c("a","b","c")

为了构建我自己的函数,我尝试了以下代码:

f<-function(df,gr){

enquo_df<-enquo(df)
enquo_gr<-enquo(gr)

r<-df%>%
   dplyr::mutate(UQ(paste("CI",enquo_gr,sep="_")):=
                   sprintf("(%s,%s)",
                           paste("CIlow",quo_name(enquo_gr),sep="_"),
                           paste("CIhigh",quo_name(enquo_gr),sep="_")))

return(r)
}

但是在使用函数时

library(dplyr)

group<-c("a","b","c")
    dataframe<-data.frame(CIlow_a=c(1.1,1.2),CIlow_b=c(2.1,2.2),CIlow_c=c(3.1,3.2),CIhigh_a=c(1.3,1.4),CIhigh_b=c(2.3,2.4),CIhigh_c=c(3.3,3.4))

f(df=dataframe,gr=group)

我没有得到预期的输出

output<-data.frame(CI_a=c("(1.1,1.3)","(1.2,1.4)"),
                  CI_b=c("(2.1,2.3)","(2.2,2.4)"),
                  CI_c=c("(3.1,3.3)","(3.2,3.4)"))

但出现以下错误消息:

错误:LHS 必须是名称或字符串

你知道为什么吗?我该如何解决这个问题?提前致谢。

【问题讨论】:

  • 什么是enquo_shortgr?
  • 您能否提供一个可重现的示例(即提供您正在使用的所有数据和库以及代码)?
  • 抱歉@F.Privé,enquo_shortgr 是在将代码从真实案例转移到此示例时出错。正确的名字当然是enquo_gr。我刚刚更正了问题中的代码。
  • @dvarelas 此处使用的唯一包是dplyr(在唯一使用的函数之前编写,即 dplyr::mutate)。无论如何,为了澄清我在我的问题代码中添加了以下行:library(dplyr)
  • 你能提供预期的输出吗?我不明白你的函数应该返回什么。

标签: r dplyr rlang


【解决方案1】:

老派解决方案:

res <- as.data.frame(matrix(NA_character_, nrow(dataframe), ncol(dataframe) / 2))
for (i in seq_along(group)) {
  var <- paste0("CI", c("low", "high"), "_", group[[i]])
  res[[i]] <- sprintf("(%s,%s)", dataframe[[var[[1]]]], dataframe[[var[[2]]]])
}
names(res) <- paste0("CI_", group)

【讨论】:

  • 感谢您的建议,但我更喜欢遵循我的问题方法的功能。
猜你喜欢
  • 1970-01-01
  • 2018-05-06
  • 2018-11-11
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多