2016-06-10 102 views
-3

我有這樣的事情在一個函數中:試圖比較POSIXct對象中的if語句

x <- as.POSIXct((substr((dataframe[z, ])$variable, 1, 8)), tz = "GMT", 
format = "%H:%M:%S") 
print(x) 
if ((x >= as.POSIXct("06:00:00", tz = "GMT", format = "%H:%M:%S")) & 
(x < as.POSIXct("12:00:00", tz = "GMT", format = "%H:%M:%S"))){ 
position <- "first" 
} 

,但我得到這樣的輸出:

character(0) Error in if ((as.numeric(departure) - as.numeric(arrival)) < 0) { : argument is of length zero

我怎麼能解決這個問題,所以我比較的作品和它打印正確的東西?

數據框$變量列的一些例子: 16點33分00秒 15:34:00 十四時51分00秒 七時26分00秒 5時48分00秒 11時10分00秒 17:48:00 06:17:00 08:22:00 11:31:00

+0

如果有人知道我可以在if語句中比較as.POSIXct對象,我將非常感激。 –

+0

我可以假設您已將問題縮小到您向我們展示的代碼部分了嗎?否則你的錯誤說,所以我希望你已經裁定「出發 - 到達」部分? – rosscova

+1

因爲你的值已經是正確的格式,你打電話給substr的任何原因? – rosscova

回答

1

歡迎來到Stack Overflow!

首先,你得到一些反對票的原因很可能是因爲你沒有給你太多的問題繼續下去。首先,你沒有告訴我們什麼

(dataframe[z, ])$variable 

是,這使我們很難制定一個完整的答案。您似乎試圖從數據框中提取單個值,是嗎?如果是這樣,我從來沒有見過它這樣做的方式,嘗試更換上面:

dataframe$variable[z] 

我的猜測是你想達到什麼樣的數據幀的一整列的所謂的「變量」的比較,因爲這通常更有用...

話雖如此,我經常反對與時間數據的問題,從我聽到的,我的經驗並不少見。當我正在處理的時候,因爲看起來你在這裏,我更喜歡在POSIXct上使用chron :: times格式(POSIX是日期時間格式,所以總是包含日期,它也會嘗試更正時區更改,以及夏令時的變化,這些變化往往會影響我的方式而不是幫助)。如果您的數據採用了您在第一次as.POSIXct調用中指定的格式,那麼您甚至不需要指定調用times函數。

x <- chron::times(dataframe$variable) 
print(x) 
position <- ifelse (x >= chron::times("06:00:00") & 
        x < chron::times("12:00:00"), 
       "first", "not first" 
) 

這將輸出一個矢量「位置」,其結果是從dataframe $ variable中獲取的所有值。這是否達到了你的期望?

從這裏,如果你是想提取的比較結果在數據幀的特定行「Z」,你仍然可以做到這一點與

position[z] 

編輯補充: 這可能是值得檢查缺少「變量」中的值。這應該返回TRUE:

sum(is.na(dataframe$variable)) == 0 

還檢查任何格式不正確。同樣,這應該返回TRUE:

sum(is.na(chron::times(dataframe$variable))) == 0 

編輯補充: 按照意見,它看起來像某些值在「變量」列不正確轉換。你應該可以找到它們

subset(dataframe, is.na(chron::times(variable))) 

這應該讓你看看有什麼不對。它可能是一個單元,也可能是其中的一部分。你需要整理這些數據,你可以用幾種方法來完成。您可以手動完成並修復它們,您可以在腳本中添加一個函數以在轉換之前修復它們(如果所有這些值之間存在共同的問題,或者您希望遇到同樣的問題,這可能是個好主意當新數據進入時再次發生,如果確實需要允許的話)。

另一種選擇是簡單地從分析中排除這些行。如果你走這條路線,確保它適合你正在運行的分析。如果你的情況適合,您可以添加步運行在你的問題的步驟之前進行清理數據框:

dataframe <- subset(dataframe, !is.na(chron::times(variable))) 

注意:有一個很好的機會,這將拿出一個警告。如果兩次運行同一行,並且第二次警告消失(在違規行被刪除後),則可能需要進一步研究。

這應該放棄違規值,只保留正確轉換爲時間格式的值,這應該有助於您嘗試運行的步驟。檢查您的數據框維度在該步驟之前和之後的變化情況;那會告訴你你有多少行正在丟失。

你可以用POSIXct做同樣的事情,如果這就是你感覺舒服的話,我個人更喜歡你正在做的事。

+0

我嘗試使用chron :: times,正如你所建議的那樣,但是當我打印x在我的函數中我仍然得到不正確的東西(時間(0)),並且我使用POSIXct得到了字符(0)。你知道爲什麼會發生這種情況嗎?當我將它複製到我的所有打印和比較中時,控制檯,但是當我運行頁面沒有任何作用 –

+0

這聽起來像是你的代碼中的其他地方出現錯誤,或者更可能是數據中某處格式不匹配,再次,沒有一個完整的圖片很難給出一個好的答案。 – rosscova

+0

dataframe $變量的外觀如何? – rosscova