2017-11-02 9 views
2

私はsales1sales2price1price2ラベル列を持つデータフレームを持っていると私は、反復方法で各数全体sales1 * price1ので、オンを乗じて収入を計算したい全体に乗算します。ループが列

data <- data_frame(
    "sales1" = c(1, 2, 3), 
    "sales2" = c(2, 3, 4), 
    "price1" = c(3, 2, 2), 
    "price2" = c(3, 3, 5)) 

data 
# A tibble: 3 x 4 
# sales1 sales2 price1 price2 
# <dbl> <dbl> <dbl> <dbl> 
#1  1  2  3  3 
#2  2  3  2  3 
#3  3  4  2  5 

なぜ次のコードは機能しませんか?

data %>% 
    mutate (
    for (i in seq_along(1:2)) { 
     paste0("revenue",i) = paste0("sales",i) * paste0("price",i) 
    } 
) 
+0

は、[この](https://stackoverflow.com/questions/46832436/dplyr-mutate-formula-based-on-similarities-in-column-names/46836700#46836700) – useR

答えて

3

と仮定すると、あなたの列がすでに(sales1sales2price1price2)命じています。我々は2つの部分にデータフレームを分割して、列が既にその名前に従ってソートされていない場合は

data[grep("sales", names(data))] * data[grep("price", names(data))] 

# sales1 sales2 
#1  3  6 
#2  4  9 
#3  6  20 

、我々はorderを使用して、それらを並べ替えた後、上記のコマンドを使用することができ、それらを掛けることができます。

data <- data[order(names(data))] 
1

この回答は簡単ではありません。そのためには、@ RonakShahの既存の答えが見てください!

私の回答は、tidyverseでこれを行うことの難しさに関するより広い懸念に対処することを目的としています。データが現在「整然とした」フォーマットになっていないため、私の理解は難しいです。あなたが戻ってすることができます元の形式にデータを取得する必要がある場合は、

tidy_df %>% mutate(revenue = sales * price) 

#> # A tibble: 6 x 5 
#> rowname id price sales revenue 
#>  <chr> <chr> <dbl> <dbl> <dbl> 
#> 1  1  1  3  1  3 
#> 2  1  2  3  2  6 
#> 3  2  1  2  2  4 
#> 4  2  2  3  3  9 
#> 5  3  1  2  3  6 
#> 6  3  2  5  4  20 

最終的な計算は簡単になり

library(tidyverse) 

tidy_df <- data %>% 
    rownames_to_column() %>% 
    gather(key, value, -rowname) %>% 
    extract(key, c("variable", "id"), "([a-z]+)([0-9]+)") %>% 
    spread(variable, value) 

:代わりに、あなたはそうのようなきちんとしたデータフレームを作成することができますこれは私にとっては気難しい(私はこれがいくらか改善することができると確信しています)。

tidy_df %>% mutate(revenue = sales * price) %>% 
    gather(key, value, -c(rowname, id)) %>% 
    unite(key, key, id, sep = "") %>% 
    spread(key, value) %>% 
    select(starts_with("price"), 
     starts_with("sales"), 
     starts_with("revenue")) 

#> # A tibble: 3 x 6 
#> price1 price2 sales1 sales2 revenue1 revenue2 
#> * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#> 1  3  3  1  2  3  6 
#> 2  2  3  2  3  4  9 
#> 3  2  5  3  4  6  20 
+0

を見てみましょうI説明したようにデータが構造化されていないという問題を参照してください。文脈の別の例dfを参照してください 'record < - c(seq_along(1:10)) 店< - c(1,2,3,4,5,1,2,3,4,5) 週< - c(1,1,3,1,1,2,2,2,2) sales_1 < - c(3,3,3,3,3,2,5,1,2,10) sales_2 < - c(1,2,4,5,6,2,3,6,1,8) price_1 < - runif(10,2,6) price_2 < - runif(10,2,6) df < - data_frame(レコード、店舗、週、sales_1、sales_2、price_1、price_2) ' ストローマンコードを使用して'売上 'と'価格 'の列を集約するのが難しいです。おそらくこの例を使って私を歩いてもらえますか? – Gulbas

+0

@Gulbas、それは私にとっては新しい質問のようですね。あなたがそれを1つとして投稿すると、私は答えを提供しようとします(あなたは他の方が良い解決法を見つけるかもしれません)。新しい質問でいつでもこの質問にリンクして、他のユーザーにあなたが探している回答の種類を知らせることができます – markdly