2016-09-30 5 views
1

Rでは、適切な名前の値をvector(またはdata.frameなど)に格納してdata.frame列を操作それが簡単ならば)。外部ベクトル(dplyr)と異なる値を持つデータフレーム列を操作する方法

は、私は、変数disphp、およびwtmtcarsデータセットから最初のsummariseにしたい、のは、言ってみましょう。

vars <- c("disp", "hp", "wt") 
mtcars %>% 
    summarise_at(vars, funs(sum(.)) 

(ミックスにgroup_by(cyl)を投げる、またはあなたがより多くの行を持っているしたい場合はmutate_atを使用)

今、私は与えられた、特定の値と結果の各列を掛けたいのですがby

multiplier <- c("disp" = 2, "hp" = 3, "wt" = 4) 

summarise_atの機能でこれらを参照することはできますか?

結果は次のようになります(と私はそこに取得しながら、直接変数名を参照する必要がありますする必要はありません):

disp hp wt 
14766.2 14082 411.808 

UPDATE:

を多分私のMWEはあまりにも最小でした。

cyl disp hp  wt 
1  4 2313.0 2727 100.572 
2  6 2566.4 2568 87.280 
3  8 9886.8 8787 223.956 

UPDATE 2:

たぶん私は十分に明示しなかったのは、私は結果はこのようにする必要がありますcyl

mtcars %>% 
    group_by(cyl) %>% 
    summarise_at(vars, sum) 

でグループ化されたdata.frameと同じ操作をしたいとしましょうここでもどちらかですが、data.frameの列には、ベクトルの各値(ベクトルに記述されている列のみ)が乗算される必要があります。 dispは2でhpを3倍、wtを4倍する必要がありますが、他のすべての変数(例:cyl)は乗算の影響を受けません。

答えて

1

また更新問題についてpurrr

library(purrr) 
mtcars %>% 
    summarise_at(vars, sum) %>% 
    map2_df(multiplier, `*`) 
#  disp hp  wt 
#  <dbl> <dbl> <dbl> 
# 1 14766.2 14082 411.808 

からmap機能でこれを行うことができ

d1 <- mtcars %>% 
     group_by(cyl) %>% 
     summarise_at(vars, sum) 
d1 %>% 
    select(one_of(vars)) %>% 
    map2_df(multiplier[vars], ~ .x * .y) %>% 
    bind_cols(d1 %>% select(-one_of(vars)), .) 
# cyl disp hp  wt 
# <dbl> <dbl> <dbl> <dbl> 
#1  4 2313.0 2727 100.572 
#2  6 2566.4 2568 87.280 
#3  8 9886.8 8787 223.956 

それともを使用することができます210

library(tidyr) 
mtcars %>% 
    group_by(cyl) %>% 
    summarise_at(vars, sum) %>% 
    gather(var, val, -cyl) %>% 
    mutate(val = val*multiplier[match(var, names(multiplier))]) %>% 
    spread(var, val) 
#  cyl disp hp  wt 
# <dbl> <dbl> <dbl> <dbl> 
#1  4 2313.0 2727 100.572 
#2  6 2566.4 2568 87.280 
#3  8 9886.8 8787 223.956 
+0

私は間違っているかもしれませんが、これは 'group_by(cyl)'ではうまくいかないでしょうか? "エラー:' .x'(4)と '.y'(3)の長さが異なる – dpprdan

+0

@dapperdanあなたの質問は' group_by'に関するものではありません – akrun

+0

まあ、私は十分に明示的ではなかったかもしれませんが、 "(ミックスにgroup_by(cyl)を投げたり、もっと行があるようにするにはmutate_atを使用してください)"、そうでしたか? – dpprdan

0

がグループ化VARを含める**** **** REDUX ...

library(dplyr) 
library(purrr) 

vars <- c("disp", "hp", "wt") 
multiplier <- c("disp" = 2, "hp" = 3, "wt" = 4) 

mtcars %>% 
    summarise_at(vars, sum) %>% 
    do(. * multiplier) 

    disp hp  wt 
1 14766.2 14082 411.808 

私はあなたがsummarise_at機能でこれを行うことができるかどうかわからないが、これは近い代替手段ですcylmultiplierに設定し、それを1に設定します。@akrun'smap2_dfここで実際の作業を行います。

vars <- c("disp", "hp", "wt") 
multiplier <- c("cyl" = 1, "disp" = 2, "hp" = 3, "wt" = 4) 

mtcars %>% 
    group_by(cyl) %>% 
    summarise_at(vars, sum) %>% 
    map2_df(multiplier, ~ .x * .y) 


    cyl disp hp  wt 
    <dbl> <dbl> <dbl> <dbl> 
1  4 2313.0 2727 100.572 
2  6 2566.4 2568 87.280 
3  8 9886.8 8787 223.956 
+0

addを 'group_by(cyl)'を加えることによって)これらは行ごとに乗算されます。追加の列(ここでは 'cyl')も同様に乗算されます。名前付きベクトルに記載されている列にそのベクトルの値を乗算したいので、disp * 2、hp * 3、wt * 4)。 – dpprdan

+0

私はこれを編集しましたが、これはうまくいくはずです。 – conor

+0

さて、 'cyl'を' multiplier 'に加えるより良い選択肢は 'map2_df'で' multiplier [vars] 'を使うのが一般的だからです。これと残りの部分は本当に@ akrunの答えなので、私は自分の質問に対する答えとして彼をマークしています。 – dpprdan

関連する問題