参数长度为0,没有NA

时间:2016-12-14 22:29:51

标签: r 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

我也尝试过更改if语句来检查:

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

但是我得到了同样的错误。

有什么想法吗?

如果您决定投票,请向我解释我的问题有什么问题。我正在努力学习,并希望确保我正确地提出要求。

注意:我遇到了另一个问题并完全改变了问题。因此,下面的一些评论不适用。由于票数下降,我无法提出新的问题。

2 个答案:

答案 0 :(得分: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, .))

答案 1 :(得分: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))

当然,这也会将任何有意义的日期时间转换为数字。