lapply一个函数,用于更改列表的每个元素的参数值

时间:2015-12-10 21:11:38

标签: r list lapply mapply

我有一个数据框列表

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

我想在列表中应用此功能。 条件是函数中参数ulll的值会更改列表中的每个元素。

我不能写: lapply(listofdf, remove_outliers, 0.01, 0.99)因为0.01&amp; 0.99的变化取决于df。

我知道这可以使用Mapmapply来解决,所以我尝试了这个:

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

3 个答案:

答案 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")