首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建(dplyr::mutate)和选择(dplyr:: select )通过用户定义的函数粘贴两个现有列的新变量

创建(dplyr::mutate)和选择(dplyr:: select )通过用户定义的函数粘贴两个现有列的新变量
EN

Stack Overflow用户
提问于 2017-07-09 16:12:26
回答 3查看 1.5K关注 0票数 1

使用用户定义的函数,我必须加入数据帧中选定的列数的置信区间(称为CIlowCIhigh)的下限和上限。数据框架包含CIlowCIhigh,用于许多组(名为abc)和数字行(在本例中只有两个)。如下所示,数据框架是什么样的。

代码语言:javascript
运行
复制
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))

我希望在现有组( abc)中为选定的组(例如,abc)中的每个组设置一个联合列。

因此,预期产出应如下:

代码语言:javascript
运行
复制
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)"))

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

代码语言:javascript
运行
复制
f<-function(df,gr){

enquo_gr<-enquo(gr)

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

return(r)
}

但是,当以这种方式使用上述函数时

代码语言:javascript
运行
复制
library(dplyr)
group<-c("a","b")
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)

我收到以下错误消息:

错误:expr必须引用符号、标量或调用

我怎样才能解决这个问题?

PS1:这个问题类似于a previous one。但是,由于需要选择要合并的列,这个问题更进一步。

PS2:我希望遵循这个问题的方法来提供代码建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-21 15:00:11

我自己找到了解决问题的办法。以下代码起作用:

代码语言:javascript
运行
复制
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)"))

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 <- function(df, gr){

   sl <<-  rlang::syms(paste("CIlow", gr, sep="_"))
   sh <<-  rlang::syms(paste("CIhigh", gr, sep="_"))
   nmN <<- paste("CI", gr, sep= "_")
   r<-df

for(i in 1:length(gr)){
        r<-dplyr::mutate(r,UQ(nmN[i]) := sprintf("(%s;%s)", UQ(sl[[i]]),UQ(sh[[i]])))
}
   r<- dplyr::select(r,nmN)
return(r)

 }

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

x<-f(df=dataframe, gr=group)

该代码适用于group中未定义的元素数。因此,它适用于c("a","b")c("a")c("a","b","c")

我知道不推荐循环。如果有更好的解决方案,我们将不胜感激。

票数 0
EN

Stack Overflow用户

发布于 2017-07-09 18:27:48

如果要传递引号字符串,则使用sym (用于返回list的多个元素- syms )。

代码语言:javascript
运行
复制
f <- function(df, gr){
   sl <-  rlang::syms(paste("CIlow", gr, sep="_"))
   sh <-  rlang::syms(paste("CIhigh", gr, sep="_"))
   nmN <- paste("CI", gr, sep= "_")


   df %>%
       dplyr::mutate(!!(nmN[1]) := sprintf("(%s,%s)",
                               !!(sl[[1]]), !!(sh[[1]])),
                     !!(nmN[2]) := sprintf("(%s,%s)",
                               !!(sl[[2]]), !!(sh[[2]]))) %>%
       dplyr::select(paste("CI", gr, sep="_"))



 }

group <- c("a","b")
f(dataframe, group)
#      CI_a      CI_b
#1 (1.1,1.3) (2.1,2.3)
#2 (1.2,1.4) (2.2,2.4)
票数 1
EN

Stack Overflow用户

发布于 2017-08-12 00:51:41

根据这个问题,我可能会回答不同的问题,但是在检查了您的答案之后,我准备了下面的代码。它使用技巧与lapply,从这里dplyr::unite across column patterns。我不确定是否使用dplyr/tidyr是最好的选择,也许简单的for会更简单。

代码语言:javascript
运行
复制
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)"),
                     stringsAsFactors = F)

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))


tricky <- function(input_data, group_ids){

  # convert columns to character

  input_data <- input_data %>%
    mutate_each(funs(as.character(.)))

  # unite selected groups

  output <- group_ids %>%
    lapply(function(group_id) {unite_(input_data, 
                                      paste0("CI_", group_id), 
                                      paste0(c("CIlow_", "CIhigh_"), group_id), 
                                      sep = ',') %>% select_(paste0("CI_", group_id))}) %>%
    bind_cols() %>%
    mutate_each(funs(paste0("(", ., ")")))

  return(output)

}

identical(tricky(dataframe, list("a", "b")), output)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44998441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档