我有一个数据框列表
listofdf <- list(a = a, b = b, c = c)
我有一个功能:
remove_outliers <- function(x, ll, ul) {
require(dplyr)
x <- x %>% filter(SALES < quantile(SALES, probs = c(ll)) & SALES > quantile(SALES, probs = c(ul)))
return(x)
}
我想在列表中应用此功能。 条件是函数中参数ul
和ll
的值会更改列表中的每个元素。
我不能写: lapply(listofdf, remove_outliers, 0.01, 0.99)
因为0.01&amp; 0.99的变化取决于df。
我知道这可以使用Map
或mapply
来解决,所以我尝试了这个:
listofdf <- Map(remove_outliers, listofdf, MoreArgs = list(ll = c(0.1, 0.2, 0.3), ul = c(0.90, 0.95, 0.99)))
但是我遇到了错误:
Warning messages:
1: In filter_impl(.data, dots) :
longer object length is not a multiple of shorter object length
2: In filter_impl(.data, dots) :
longer object length is not a multiple of shorter object length
3: In filter_impl(.data, dots) :
longer object length is not a multiple of shorter object length
4: In filter_impl(.data, dots) :
longer object length is not a multiple of shorter object length
答案 0 :(得分:1)
在这里,我尝试使用虚拟的removeOutlier函数
remove_outliers <- function(x, ll, ul) {
return(x>ll & x< ul)
}
listofdf <- list(a = 1:10, b = 100:120, c = 1000:1010)
filt<- mapply( FUN=remove_outliers, listofdf ,
ll=c(2,102,1004), ul=c(8,117,1008) )
res<- mapply(FUN="[", listofdf,filt)
res
答案 1 :(得分:1)
传递参数的方式可能有问题。只需尝试:
mapply(remove_outilers, l, ll = c(0.1, 0.2, 0.3), ul = c(0.90, 0.95, 0.99))
答案 2 :(得分:0)
为什么不绑定到单个数据帧?
big_data =
listofdf %>%
bind_rows(.id = "source")