2015-12-10 4 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) 
} 

Я хочу, чтобы применить эту функцию в списке , Условие состоит в том, что значение аргументов ul и ll в изменении функции для каждого элемента списка.

Я не могу написать:lapply(listofdf, remove_outliers, 0.01, 0.99), потому что 0,01 & 0,99 изменяются в зависимости от ФР.

У меня есть подозрение, что это может быть решена с помощью 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 
+2

Не используйте 'MoreArgs' в' Map'. Просто попробуйте «Карта (remove_outliers, listofdf, c (0.1, 0.2, 0.3), c (0.90, 0.95, 0.99))' – nicola

+0

возвращает пустой список! ** царапины головы ** – vagabond

+0

после 2 часов борьбы, я понимаю, что я менял значения аргументов в функции, когда я использовал карту, которая привела к набору данных NULL. Короче говоря, я писал: «Map (remove_outliers, listofdf, c (0.9, 0.95, 0.98)», c (0.1, 0.2, 0.3)) »и, очевидно, ни одна строка в моих данных не соответствовала этому условию! – vagabond

ответ

0

Почему не связываются в единую dataframe ?

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

Смежные вопросы