2015-12-10 77 views
0

的每個元素我有數據的列表,改變參數值的函數幀lapply與列表

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的值在列表中的每個元素的函數更改中。

我不能寫:這取決於DFlapply(listofdf, remove_outliers, 0.01, 0.99)因爲0.01 & 0.99變化。

我有一個暗示,這可以使用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 
+2

不要在'Map'中使用'MoreArgs'。試試'Map(remove_outliers,listofdf,c(0.1,0.2,0.3),c(0.90,0.95,0.99))' – nicola

+0

返回一個空的列表! **在2個小時的掙扎之後劃傷頭部** – vagabond

+0

,我意識到當我使用導致NULL數據集的Map時,我正在顛倒函數中參數的值。總之我寫的是:'map(remove_outliers,listofdf,c(0.9,0.95,0.98),c(0.1,0.2,0.3))',我的數據中顯然沒有任何一行符合這個條件! – vagabond

回答

0

爲什麼不綁定到一個單一的數據幀?

big_data = 
    listofdf %>% 
    bind_rows(.id = "source") 
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 
+0

感謝您的嘗試。我一直都有答案,只是誤解了結果。 – vagabond

1

嘗試它有可能是與你傳遞參數的方式有問題。只需嘗試:

mapply(remove_outilers, l, ll = c(0.1, 0.2, 0.3), ul = c(0.90, 0.95, 0.99)) 
+0

函數「l」中的第二個參數是什麼?代表名單的名字?我嘗試了這種格式:'mapply(remove_outliers,listofdf,ll = c(0.01,0.02,0.03),ul = c(0.95,0.98,0.99))' - 返回一個空列表! – vagabond

+0

謝謝你的嘗試。我一直都有答案,只是誤解了結果。 – vagabond