2016-03-30 7 views
0

magrittr、dplyr、おそらくはpurrrの簡潔さを使って、1つの変数xで大きなデータフレーム(さまざまな型の変数を多数)グループ内の各グループおよび行に対してによって条件付きで異なる機能を第2の変数yに適用します。条件付きでRのグループ化されたデータフレームにmagrittr、dplyr、およびpurrrを使って関数を適用する

xが要因(foobar)であるデータフレームdf <- data.frame(a, b, x, c, d, y)をとるとyは数字です。

df$y[df$x == "foo"] %<>% subtract(min(.)) 
df$y[df$x == "bar"] %<>% add(max(df$y[df$x == "foo"])) 

が、私はこの使用してdplyrを書き換えるとdfのために長いパイプに追加したいのですが、すべての私の試みはmutatesapplydoを組み合わせること:私は、私は、このようunpipedワークフローにinelegantly説明してきたものを行うことができます失敗しました;匿名機能を持つpurrrを組み込む試みとして、by_slicedmapがあります。

多くのアドバイスをいただきありがとうございます。

+1

私は試みることができるサンプルデータセットを供給することができれば答える。 – timelyportfolio

答えて

1

これはdplyrより多くはmagrittrですが、わかりやすくあります。私は%<>%で少し不快です。なぜなら、操作の線形構造を混乱させ、コードを読みにくくするからです。だからここで%>%を使うだけです。

あなたの記述に一致する例のデータフレーム:

df <- data.frame(a = 'a', 
       b = 'b', 
       x = c("foo", "bar") , 
       c = 'c', 
       d = 'd', 
       y = 1:6) 
df 
    a b x c d y 
1 a b foo c d 1 
2 a b bar c d 2 
3 a b foo c d 3 
4 a b bar c d 4 
5 a b foo c d 5 
6 a b bar c d 6 

あなたのコード:

library(dplyr) 
library(magrittr) 
df$y[df$x == "foo"] %<>% subtract(min(.)) 

df 
    a b x c d y 
1 a b foo c d 0 
2 a b bar c d 2 
3 a b foo c d 2 
4 a b bar c d 4 
5 a b foo c d 4 
6 a b bar c d 6 

df$y[df$x == "bar"] %<>% add(max(df$y[df$x == "foo"])) 

df 
    a b x c d y 
1 a b foo c d 0 
2 a b bar c d 6 
3 a b foo c d 2 
4 a b bar c d 8 
5 a b foo c d 4 
6 a b bar c d 10 

dplyrソリューション:

df %>% 
    mutate(y = ifelse(x == "foo", y - min(y), y)) %>% 
    mutate(y = ifelse(x == "bar", y + max(y[x == 'foo']), y)) 

    a b x c d y 
1 a b foo c d 0 
2 a b bar c d 6 
3 a b foo c d 2 
4 a b bar c d 8 
5 a b foo c d 4 
6 a b bar c d 10 
関連する問題