0

私はRの初心者なので、質問するのに苦労するかもしれません。我慢してください。

2つのデータフレームがあります。説明のためにふりをしましょう:

df1

列は、トウモロコシ、オーツ麦、小麦などの利益の種類を表します。行は、その年の月、1月、2月などを表します。要素は、その特定の月に購入したその利益の種類の1トンあたりの価格を表します。

df2

国を表す列:スペイン、チリ、メキシコなど。このフレームの行は、その国を処理するための追加費用を表します。たとえば、各国の梱包費用、送料、国の輸入税、検査料などです。

次に、3番目のデータフレームを作成します。

df3

これは、穀物の組み合わせ(たとえば、トウモロコシ10%、オート麦50%など)の総コストと、すべての国の送料、税金などに関連するコストを毎月表すことです。方程式があると仮定します。 (df1とdf2のデータを使用して)穀物の特定の組み合わせに対する国ごとの1か月あたりの総コストと、各国の追加コストを計算します。

簡潔にするために、3月の総コストの方程式の一部を考えてみましょう。スペインは、

cost <- .10 * df1[ “mar”,”oats”]  + df2[“tax”,”Spain”]  + .....

2番目のデータフレームの要素を選択し、最初のデータフレームの列を使用して演算を実行して、結果を取得するのは簡単です。特定の国の場合:

cost <- .10 * df1[ ,”oats”]  + df2[“tax”,”Spain”]  + .....

これは私にスペインの毎月の費用を与えます

問題は、すべての国で同じ計算を繰り返さなければならないということです。

別のバージョン:

  cost <- .10 * df1[ ,”oats”]  + df2[“tax”,]  + .....

各国の費用を教えてくれますが、1月のみです

すべての郡の1か月あたりの総費用を計算する1セットの方程式を作成したいと思います。言い換えると、(月)と同じdf3行数、 (国)と同じ列数になります。df1df2

編集...閉じた質問に投稿された例に貼り付けます:

# build df1 - cost of grains (with goofy data so I can track the arithemetic)
  v1 <- c(1:12)
  v2 <- c(13:24)
  v3 <- c(25:36)
  v4 <- c(37:48)
  grain <- data.frame("wheat"=v1,"oats"=v2,"corn"=v3,"rye"=v4)

  grain

# build df2 - additional costs (again, with goofy data to see what is being used where and when)
  w1 <- c(1.3:4.3)
  w2 <- c(5.3:8.3)
  w3 <- c(9.3:12.3)
  w4 <- c(13.3:16.3)
  cost <- data.frame("Spain"=w1,"Peru"=w2,"Mexico"=w3,"Kenya"=w4)
  row.names(cost) <- c("packing","shipping","tax","inspection")

  cost

# assume 10% wheat, 30% oats and 60% rye with some clown-equation for total cost
# now for my feeble attempt at getting a dataframe that has 12 rows (months) and 4 column (countries)

  total_cost <- data.frame( 0.1*grain[,"wheat"] +
                            0.3*grain[,"oats"] +
                            0.6*grain[,"rye"] +
                            cost["packing","Mexico"] +
                            cost["shipping","Mexico"] +
                            cost["tax","Mexico"]  +
                            cost["inspection","Mexico"] )
  total_cost
4

1 に答える 1

1

いくつかの選択肢があります。1 つはouter、df2 の colnames から「月」ベクトルと「国」ベクトルの入力を提供する関数を使用し、df1 と df2 から「コスト」コンポーネントを引き出す関数を使用することです。(そのアプローチを機能させることができませんでした。)「月」×「国」の行列が得られます。もう1つは、df2データフレームを転置し、all = TRUEを使用してdf1を使用してマージし、数式で列操作を実行できる「長い」形式のデータフレームを取得してから、「国」で「広い」形式に再形成することです。詳細は特定のデータ設定に依存し、まだ例を提供していません。

これにより、月と国の組み合わせの 12 x 4 グリッドが得られます。

 dfrm <- expand.grid(grain$months,  colnames(cost) )

これにより、月の値と国の値を取り、上記の式を計算する関数が得られます。

 costcros <- function(x) { sum(grain[ grain[, 'months'] == x[1], c(1,2,4)]*c(0.1,0.3,0.6) ) + 
                           sum( cost[, x[2]]) }

これにより、dfrm の各行に計算が追加されます。

 dfrm$crosscost <- apply(expand.grid(grain$months,  colnames(cost) ), 1,  costcros)
于 2012-09-10T15:59:55.247 に答える