2016-12-14 47 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