我有一个如下所示的数据框:
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)
但是我得到了同样的错误。
有什么想法吗?
如果您决定投票,请向我解释我的问题有什么问题。我正在努力学习,并希望确保我正确地提出要求。
注意:我遇到了另一个问题并完全改变了问题。因此,下面的一些评论不适用。由于票数下降,我无法提出新的问题。
答案 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))
当然,这也会将任何有意义的日期时间转换为数字。