2017-12-06 1 views
0

dplyrを使用してネストされたデータフレーム内のアウトライアを(平均値±3 * sem以上)フィルタリングします。下の入れ子になった$ data列内の値を参照するコードをどのように定式化するかはわかりません。たとえば、dplyrを使用してネストされたデータ列内の値をフィルタリングする

df <- tibble(
    a = rep(c('x', 'y', 'z'),100), 
    value = c(1:298, 999, 1000)) %>% 
    nest(value) %>% 
    mutate(mn = map_dbl(data, ~mean(.$value, na.rm = T)), 
     sem = map_dbl(data, ~sqrt(var(.$value,na.rm=T)/length(na.omit(.$value)))), 
     upper = mn + 3*sem, 
     lower = mn - 3*sem) 

これらの上限と下限に基づいてデータ列の '値'列をフィルタリングする方法を教えてください。

+0

あなたは[値]列が結果に入れ子にする必要があります同じように?そうでなければ、 'group_by(a)%>%filter(value lower)'を使うだけで、 'nest'を最初から始める必要はありません。ここでは下と上を計算する必要があります。 – Psidom

+0

ネストを使用したいと思います。私の実際のデータでは、いくつかの列にネストしていますので、ネストすることでデータフレームを視覚化しやすくなります。ネストされた要素を参照するためにコードをどのように変更しなければならないか知っていますか? – user42485

答えて

0

あなたは、dataをループにMapを使用lowerupper列並列にして、値列に基づいてdataネストされたをフィルタリングすることができます。

df %>% 
    mutate(data = Map(function(data, upper, lower) filter(data, data$value < upper, data$value > lower), data, upper, lower)) 

# A tibble: 3 x 6 
#  a    data mn  sem upper lower 
# <chr>   <list> <dbl>  <dbl> <dbl> <dbl> 
#1  x <tibble [18 x 1]> 149.5 8.703448 175.6103 123.3897 
#2  y <tibble [24 x 1]> 157.5 12.072696 193.7181 121.2819 
#3  z <tibble [24 x 1]> 158.5 12.072696 194.7181 122.2819 
関連する問題