如何解决有条件的管道内,汇总未找到列名
我在管道中包含条件项时遇到麻烦。在我的代码中,我正在对数据应用一个函数,并根据是否有任何正面结果对数据进行汇总。如果没有积极的结果,我需要输出为“ NA”。
library(tidyverse)
df<-tibble(
lab1=c(rep("cat",5),rep("carrot",rep("granite",5)),lab2=c(rep("animal",rep("vegetable",rep("mineral",res=c(9.90,10.90,11.20,8.70,10.10,9.66,13.00,8.88,9.33,8.77,7,7)
)
TestSameVal<-function(d){
if (length(unique(d$res))==1){
return(TRUE)} else return(FALSE)
}
result<-
df%>%
group_by(lab1,lab2)%>%
nest()%>%
mutate(all_sameval=map(data,TestSameVal))%>% #Returns TRUE if all measurements for a given variable are the same value
unnest(all_sameval)%>%
filter(all_sameval==T)%>% #Filter on only those variables with the same value
unnest(data)%>%
select(-all_sameval)%>%
{if (length(.$res)>0) summarise(rep_val=mean(res)) else T=NA}
#If there are any results where all_sameval is TRUE,summarise the results. Otherwise,assign NA
代码通过select(-all_sameval)正常运行。我收到由summarise
内容引起的以下错误:
Error in mean(res) : object 'res' not found
另外,当我运行以下代码时,它可以正常工作:
df%>%
group_by(lab1,TestSameVal))%>%
unnest(all_sameval)%>%
filter(all_sameval==T)%>%
unnest(data)%>%
select(-all_sameval)%>%
summarise(rep_val=mean(res))
我意识到我可以使用管道外部的条件处理此问题,但我希望尽可能简化它。确实令我不寒而栗的是,该代码昨天运行良好。我尝试更新所有软件包并重新启动R。
非常感谢您的帮助!
解决方法
在OP的代码中,我们可以将.
包装在{}
内
library(dplyr)
df%>%
group_by(lab1,lab2)%>%
nest()%>%
mutate(all_sameval=map(data,TestSameVal))%>% #Returns TRUE if all measurements for a given variable are the same value
unnest(all_sameval)%>%
filter(all_sameval==T)%>% #Filter on only those variables with the same value
unnest(data)%>%
select(-all_sameval)%>%
{if (length(.$res)>0) {.} %>%
summarise(rep_val=mean(res)) else T=NA}
# A tibble: 1 x 3
# Groups: lab1 [1]
# lab1 lab2 rep_val
# <chr> <chr> <dbl>
#1 granite mineral 7
如果我们将map_lgl
作为filter
内的逻辑向量返回,则可以避免创建列“ all_sameval”
library(dplyr)
library(purrr)
df %>%
group_by(lab1,lab2)%>%
nest() %>%
filter(map_lgl(data,TestSameVal)) %>%
unnest(data) %>%
summarise(rep_val = mean(res))
# A tibble: 1 x 3
# Groups: lab1 [1]
# lab1 lab2 rep_val
# <chr> <chr> <dbl>
#1 granite mineral 7
如果目的是filter
仅使用一个唯一的'res'值来获取组,并获得mean
df %>%
group_by(lab1,lab2) %>%
filter(n_distinct(res) > 1 & !all(is.na(res))) %>%
summarise(res = mean(res,na.rm = TRUE))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。