2012-11-09 173 views
1

我正在製作一個函數,輸出一週中的某天,給定自1970年1月1日以來的天數。當它是一個if then語句鏈時,該函數正常工作,但我想在向量上使用該函數,所以我需要構建這條愚蠢的ifelse語句鏈。嵌套的ifelse語句中未使用的參數錯誤

不幸的是,我不斷收到此錯誤:

Error in ifelse(rem == 0, day = "Thursday", ifelse(rem == 1, day = "Friday", : 
unused argument(s) (day = "Thursday") 
Calls: dayFinder -> ifelse 
Execution halted 

我一直無法弄清楚如何繞過它 - 它看起來像它只是忽略了ifelse聲明then一部分。我嘗試給它提供各種樣本數據集或數據點,並且無法修復錯誤。

這是我的代碼 - 在此先感謝。

dayFinder <- function(x){ 
#Assuming that '0' refers to January 1 1970 
#Store given number 
start <- x 
#Initialize variable 
day="Halloween" 
#Divide x by 7 and store remainder 
rem <- x%%7 
#Determine the day 
ifelse(rem==0, day="Thursday", 
    ifelse (rem==1, day="Friday", 
     ifelse (rem==2, day="Saturday", 
      ifelse (rem==3, day="Sunday", 
       ifelse (rem==4, day="Monday", 
        ifelse(rem==5, day="Tuesday", 
         if (rem==6) 
          { 
           day="Wednesday" 
           })))))) 
return(day) 
} 

q = seq(7,50,1) 
z = dayFinder(q) 
z 
+3

看過這個嗎? [在R中查找一週的日子](http://stackoverflow.com/questions/9216138/find-the-day-of-a-week-in-r)。應該很簡單,將您的天數數值轉換爲可以輸入到「平日」中的真實日期值。一般來說,如果有一個基本函數滿足您的需要,那麼它可能比您或我會寫的更仔細。 – Backlin

+1

由於他們一再重複地在dailywtf寫道,如果你想執行一些明顯的任務,這是肯定的,別人已經這樣做了。因此,在普通的R軟件包中相對容易地搜索日期/時間函數:-) –

回答

8

有幾件事情錯了ifelse鏈,但我想先提一個方式來寫這種選擇在一個更可讀的方式。

days.of.week <- c("Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday") 
x <- 21 # some value 
day <- days.of.week[(x%%7) + 1] 
day 
[1] "Thursday" 


現在...關於使用ifelseunused argument error ...
首先,記住ifelse()是一個功能,所以當你寫像
聲明... ifelse(rem == 0, day="Thursday, ...,R將解釋day="..."部分,就好像你正在通過命名參數day到該函數。
此外,一般來說,您應該避免使用= [大部分時間],您可能的意思是使用<-
無論如何,糾正了ifelse鏈應該是一些」像

rem <- 21%%7 
day <- ifelse(rem==0, "Thursday", 
     ifelse (rem==1, "Friday", 
      ifelse (rem==2, "Saturday", 
      ifelse (rem==3, "Sunday", 
       ifelse (rem==4, "Monday", 
       ifelse(rem==5, "Tuesday", "Wednesday") 
       ) 
      ) 
      ) 
     ) 
     ) 
2
dayFinder <- function(x) weekdays(as.Date("1970/1/1") + x) 
dayFinder(21) 
# [1] "Thursday" 
dayFinder(c(21, 101)) 
# [1] "Thursday" "Sunday" 
3

有有條件的再編碼比使用嵌套if else語句一個更好的方法。使用dplyr::case_when。它會改變你的真實生活。以下是case_when的代碼:

day <- case_when(
     rem==0 ~ "Thursday", 
     rem==1 ~ "Friday", 
     rem==2 ~ "Saturday", 
     rem==3 ~ "Sunday", 
     rem==4 ~ "Monday", 
     rem==5 ~ "Tuesday", 
     rem==6 ~ "Wednesday" 
    )