2013-04-05 32 views
2

在我的數據集中,我有兩年的數據,所以有730個條目。問題是,「年的日」一欄的第1年的形式爲1至365,第2年的形式相同。「if」函數的年和日

我希望列「年的日」的值爲1至730。

我的 「菜鳥功能」:

set$DoYnew = if (seq(set$Year==2002)) {set$DoY <- set$DoY+365} 

doesn't讓我進一步。它得到的錯誤是:

在如果(Z < 0){:>的條件具有長度> 1並且僅將使用的第一元件

問題在哪裏?

回答

4

錯誤是告訴你,if的子句應該只是一個單值
TRUEFALSE,但是不是例如​​。

因此,如果試圖完成類似

if (c(TRUE, FALSE, TRUE)) 
    < DO SOMETHING WHEN TRUE > 
    < DO SOMETHING DIFFERENT WHEN FALSE > 

基本if聲明將無法工作。
該聲明將僅看第一個值(如警告指示)。

對於這種情況,使用的語句是ifelse(如@Joran在他的回答中指出)

ifelse (c(TRUE, FALSE, TRUE), 
    < DO SOMETHING WHEN TRUE > , 
    < DO SOMETHING DIFFERENT WHEN FALSE >) 

set$DoYnew <- ifelse(set$Year == 2002,DoY + 365,DoY) 

此外,如果你的數據是在data.frame,你可以按需要子集:

myDF$day[myDF$Year==2002] <- 365 + myDF$day[myDF$Year==2002] 

# or if using data.table: 

myDT[year==2002, day := day + 365] 
+0

我希望沒關係,我只是把我的班輪放進你的班裏,因爲你在解釋中付出了更多的努力。 – joran 2013-04-05 18:33:48

+0

@Joran,當然。我想詳細闡述一下,因爲「if」是一個缺乏向量化的有趣案例。 – 2013-04-05 18:56:01