2016-12-14 46 views
-1

我有一個數據幀,看起來像這樣:變量是長度爲0,無NA的

  logentrytime ord_lat_dt0 ord_lat_dt1 ord_lat_dt2 ord_lat_dt3 ord_lat_dt4 ord_lat_dt5 ord_lat_dt6 ord_lat_dt7 ord_lat_dt8 ord_lat_dt9 ord_num0 ord_num1 ord_num2 
1 2016-11-10 14:23:36   0   0   0   0   0   0 2016-02-12   0   0   0  0  0  0 
2 2016-11-10 14:22:22   0   0   0   0   0   0 2016-02-12   0   0   0  0  0  0 
3 2016-11-07 16:02:45   0   0   0   0   0   0 2016-02-12   0   0   0  0  0  0 
4 2016-11-07 21:10:00   0   0   0   0   0   0 2016-02-12   0   0   0  0  0  0 
5 2016-11-07 16:03:29   0   0   0   0   0   0 2016-02-12   0   0   0  0  0  0 
6 2016-11-10 14:23:05   0   0   0   0   0   0 2016-02-12   0   0   0  0  0  0 

凡ord_lat_dt列是客戶的最後一次購買日期。 ord_lat_dt [0-9]是從不同的數據庫表中提取的。因此,每行表示一個客戶,他們的最後訂單日期將在9列中的一列中指示。

我想合併這些,但在此之前,我想根據每列中的日期計算「months_since_last_purchase」。

因此,我已轉換的日期列成字符串,和我通過使用這些功能的循環:

elapsed_time <- function(end_date, start_date) { 
    ed <- as.POSIXlt(end_date) 
    sd <- as.POSIXlt(start_date) 
    12 * (ed$year - sd$year) + (ed$mon - sd$mon) 
} 


convert_time <- function(data, column){ 
    for(i in seq(1,length(data$column))){ 
    if((data$column[i]!= "0") ==TRUE){ 
     data$column[i] <- elapsed_months(Sys.time(), as.Date(data$column[i], format="%Y/%m/%d")) 
    } 
    } 
    return(data) 
} 


test1 <- convert_time(test2, ord_lat_dt0) 

但我得到錯誤

Error in if ((data$column[i] != "0") == TRUE) { : 
    argument is of length zero 

我也試圖改變如果聲明檢查:

grepl("[-]", data$column[i])==FALSE) 

但我得到同樣的錯誤。

任何想法?

如果您決定投票,請向我解釋我的問題出了什麼問題。我正在努力學習,並希望確保我正確地問。

注:我有一個不同的問題,並完全改變了這個問題。因此下面的一些評論不適用。由於反對票,我無法提出新的問題。

+0

你想用'date-time'來代替''嗎? 「0」本身不是「日期時間」。 – aichao

+0

我不想用日期時間對象替換它,這是一個要求嗎?這是客戶交易數據,我基本上只是想要一個表示特定客戶的標誌對此列沒有價值。 – CAK

+2

這就是NA的意思,你認爲這個標誌是什麼? – denrou

回答

0

這裏的問題是,當你做data_theme[is.na(data_theme)] <- 0時,日期列中的NA將被替換。但日期列是POSIXct格式,如果您嘗試as.POSIXct(0),則會發生錯誤。

一個解決方案可能是兩步完成。首先從數字列取代NA第一,然後做任何你想要的POSIXct值:

library(dplyr) 
df %>% 
    mutate_if("is.numeric", funs(if_else(is.na(.), 0, .)) 
+0

我要去根據類似的列名稱來聚合列,這就是爲什麼我想在那裏有一個零值。無論是毫秒,秒還是無秒(即,一個零),NA不是我將嘗試去做的標誌。 – CAK

0

只能由值0替換所有的NAS如果所有列是數字的第一位。例如,可以通過編寫一個小函數來首先將列轉換爲數字,然後替換NA。使用lapply可以循環遍歷列,然後再將結果列列表作爲數據幀。

f <- function(x) { 
    x <- as.numeric(x) 
    x[is.na(x)] <- 0 
    x 
} 

data_theme <- as.data.frame(lapply(data_theme, f)) 

當然,這也會將任何有意義的日期時間轉換爲數字。

+0

感謝您的回覆。我知道如何將列更改爲數字,我的問題是,正如您所提到的,我需要保留日期時間 – CAK

+0

數據框列是同一類型值的向量;你不能混合。您必須保留NA,或者爲了您的目的填寫有意義的日期時間值。同樣的'lapply'方法仍然有用,只是改變函數f的內容以滿足你的需要(例如'if(is.numeric(x))'...)。 – mpjdem