2014-06-12 40 views
0

我正在使用物候模型,而且我當前使用的方法依賴於使用不同的最低溫度和度日的組合來確定RMSE需要。當另一個滿足條件時,用向量中的值填充數據框

基本上我有這樣的:

標題:DDcum

Day min32 min33 min34 
1 0.7904 0.7488 0.7072 
2 1.6224 1.5392 1.456 
3 2.47104 2.34624 2.22144 
4 3.31968 3.15328 2.98688 
5 4.16832 3.96032 3.75232 
6 5.00864 4.75904 4.50944 
7 5.61184 5.32064 5.02944 
8 6.0112 5.6784 5.3456 
9 6.36064 5.98624 5.61184 
10 6.64768 6.23168 5.81568 
11 6.99296 6.53536 6.07776 

積熱單位在任意極小(但數百天,最低可達50)。

我要填充類似於以下新的數據幀:

名稱:DPI

DDreq days32 days33 days34 
0  1  1  1 
1  2  2  2 
2  3  3  3 
3  4  4  4 
4  5  6  6 
5  6  7  7 
6  8  10  11 

列DDreq是所需的值(在這種情況下,最小度天積累)和days32-34中的條目是DDcum中相應列的累積和超過DDreq值的那一天。

澄清:由於DDcum $ min32的值在第1天大於0,因此dpi $ days32中的第一項爲1。dpi $ days34中的最後一項爲11,因爲DDcum $ min34的值未超過6直到第11天。

我認爲這樣做的唯一方法是對每個最小值和DDreq組合使用DDcum,並使用min函數幾十次。

我以前在Excel中使用查找功能完成了這項工作,並在R中找到了幾個類似的策略,但沒有完全按照我的需要做。我確信excel轉換器之前已經問過這個問題,但是我會很感激任何幫助。

回答

0

可以REQ值和列迭代與

req<-0:6 
dpi <- data.frame(DDreq=req, 
    t(sapply(req, function(i) { 
     sapply(DDcum[-1], function(x) 
      DDcum$Day[which(x>i)[1]] 
     ) 
    })) 
) 

我不知道你想成爲的行爲,如果該列永不滿足需要的值,但現在這將返回NA什麼。

+0

此解決方案的工作最適合我的需要但它也突出了我在R中編寫函數的知識。對於解決用戶生成函數背後的語法的書籍,您有任何建議嗎? – PoteHatesBugs

+0

@PoteHatesBugs不要難過。即使現在閱讀代碼是相當不雅,但你的需求有點棘手。我從來沒有用過自己的書,但是這個網頁應該給你很多關於許多主題的很好的見解:http://adv-r.had.co.nz/ – MrFlick

2

看起來有效的與樣本數據的方法(我猜你在「days34」的錯誤呢?):

sapply(DDcum[-1], function(x) findInterval(DDreq, x) + 1) 
#  min32 min33 min34 
#[1,]  1  1  1 
#[2,]  2  2  2 
#[3,]  3  3  3 
#[4,]  4  4  5 
#[5,]  5  6  6 
#[6,]  6  7  7 
#[7,]  8 10 11 

DDcum = structure(list(Day = 1:11, min32 = c(0.7904, 1.6224, 2.47104, 
3.31968, 4.16832, 5.00864, 5.61184, 6.0112, 6.36064, 6.64768, 
6.99296), min33 = c(0.7488, 1.5392, 2.34624, 3.15328, 3.96032, 
4.75904, 5.32064, 5.6784, 5.98624, 6.23168, 6.53536), min34 = c(0.7072, 
1.456, 2.22144, 2.98688, 3.75232, 4.50944, 5.02944, 5.3456, 5.61184, 
5.81568, 6.07776)), .Names = c("Day", "min32", "min33", "min34" 
), class = "data.frame", row.names = c(NA, -11L)) 

DDreq = 0:6 
相關問題