如何解决在dplyr管道中应用函数
给出一个像data
这样的数据框:
data <- data.frame(group = rep(c('a','b'),each= 100),value = rnorm(200))
我们要使用group == b
过滤dplyr
的值,并使用boxplot.stats
来识别异常值:
library(dplyr)
data%>%
filter(group == 'b')%>%
summarise(out.stats = boxplot.stats(value))
这将返回错误Column
out.stats must be length 1 (a summary value),not 4
,为什么这不起作用?您如何在管道内应用这样的功能?
解决方法
以下是该问题的答案以及该问题的最后评论,OP在其中询问异常值的行号。
如果要返回附带的行号该怎么办
boxplot.stats()$out
来自管道?所以如果我们做到了b<-data%>%filter(group=='b')
在管道外部,我们可以使用:which(b$value %in% boxplot.stats(b$value)$out)
这是通过left_join
处理原始数据来完成的。
library(dplyr)
set.seed(1234)
data <- data.frame(group = rep(c('a','b'),each= 100),value = rnorm(200))
data %>% filter(group == 'b') %>% pull(value) %>%
boxplot.stats() %>% '[['('out') %>%
data.frame() %>%
left_join(data,by = c('.' = 'value'))
# . group
#1 3.043766 b
#2 -2.732220 b
#3 -2.855759 b
,
我们可以使用新版本的dplyr
,它也可以返回多行的summarise
library(dplyr) # >= 1.0.0
data%>%
filter(group == 'b')%>%
summarise(out.stats = boxplot.stats(value))
# out.stats
#1 -2.4804222,-0.7546693,0.1304050,0.6390749,2.2682247
#2 100
#3 -0.08980661,0.35061653
#4 -3.014914
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。