2012-09-10 61 views
0

我是R的新手,我可能很難提問我的問題。請多多包涵。從其他數據幀的功能創建新的數據幀

我有兩個數據幀。讓我們假設爲便於說明:

DF1

列代表類型的收益:玉米,燕麥,小麥等 行代表一年中的一個月,一月,二月,等 元素代表在該特定月份購買的增益類型的每噸價格。

DF2代表國家

專欄:西班牙,智利,墨西哥等 該幀的行表示額外的費用來處理這個國家,也許: 包裝成本,運輸成本,國家的進口稅,每個國家的檢查費用等。

現在我想建立一個第三數據幀:

DF3

它是代表穀物(例如10%的玉米,50%的燕麥的組合的總成本,.. )與所有國家的運輸,稅收等有關的費用,每個月假設有一個公式(使用df1和df2的數據)計算給定的穀物組合和每個國家每月的總成本每個國家的額外費用。

爲了簡便起見,讓我們說,公式爲三月的總成本的一部分,西班牙是

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

這是直接的對我來說,選擇第二個數據幀的元素和做用第一個數據幀的列進行算術運算以得到結果。針對某一特定國家:

cost <- .10 * df1[ ,」oats」] + df2[「tax」,」Spain」] + ..... 

這讓我對西班牙

每個月的費用的問題是:我要重複相同的算法對每一個國家。

另一個版本:

cost <- .10 * df1[ ,」oats」] + df2[「tax」,] + ..... 

讓我對每個國家的費用,但僅限於

我想一個方程組,讓我每月對所有的總成本縣。另外,df3將具有與df1(月)相同的行數,並且具有與df2(國家)相同的列數。

編輯...粘貼例如張貼在一個封閉的問題:

# 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

我推薦一個可重複例子。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

看看'聚合'功能。 – Max

回答

1

你有兩個選擇:一個是使用outer功能提供了「月」矢量和DF2的colnames的「國家」矢量的投入並使用一個可以從df1和df2中提取「成本」組件的函數。 (無法得到這種方法的工作。)你會得到一個'月'×'國家'矩陣。另一種方法是轉置df2數據框,並使用all = TRUE與df1合併獲得「長」格式的數據幀,從中可以使用公式對列進行操作,然後重塑爲「國家/地區」中的「寬」格式。細節將取決於具體的數據設置,你還沒有提供一個例子。

這會給你個國家個月的組合和一個12×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)