2017-09-11 59 views
0

我一直在阅读类似的文章我无法使任何解决方案适用于我的案例(可能是因为我是R新手)。将数据框中的日期与其他数据框中的两个日期进行比较

我有一个很长的数据集,有几个参数,其中一个是日期,另一个数据框的日期间隔与特定的值相对应。我试图让重复的例子:

df = data.frame(date=c("2017/08/01 19:00:00","2017/08/01 19:10:00","2017/08/01 19:20:00","2017/08/01 19:30:00", 
        "2017/08/01 19:40:00","2017/08/01 19:50:00","2017/08/01 20:00:00","2017/08/01 20:10:00"), 
      factor1=c(10,15,11,13,14,12,16,15)) 

df2 = data.frame(start=c("2017/08/01 19:00:00","2017/08/01 19:40:00"), 
      end=c("2017/08/01 19:15:00","2017/08/01 20:05:00"), factor2=c("A","B")) 

df$date <- as.POSIXct(df$date) 
df2$start <- as.POSIXct(df2$start) 
df2$end <- as.POSIXct(df2$end) 

而结果我想是这样的:

result = data.frame(date=c("2017/08/01 19:00:00","2017/08/01 19:10:00","2017/08/01 19:20:00","2017/08/01 19:30:00", 
        "2017/08/01 19:40:00","2017/08/01 19:50:00","2017/08/01 20:00:00","2017/08/01 20:10:00"), 
      factor1=c(10,15,11,13,14,12,16,15),factor2=c("A","A","NA","NA","B","B","B","NA")) 

我试着用ifelse:

ifelse(df$date >= df2$start & df$date <= df2$end,df2$factor2,"NA") 

但不能做这行得通。

有什么建议吗?

回答

1

该作品,以及在你的样本数据:

result <- df 
result$factor2 <- NA 
for (i in seq_along(df$date)){ 
    p <- ifelse(length(grep("TRUE", (df$date[i] >= df2$start & df$date[i] <= df2$end)))!=0, 
       grep("TRUE", (df$date[i] >= df2$start & df$date[i] <= df2$end)), 
       NA) 
    result$factor2[i] <- ifelse(!is.na(p), 
          as.character(df2$factor2[p]), 
          "NA") 
    } 
print(result) 
#     date factor1 factor2 
#1 2017-08-01 19:00:00  10  A 
#2 2017-08-01 19:10:00  15  A 
#3 2017-08-01 19:20:00  11  NA 
#4 2017-08-01 19:30:00  13  NA 
#5 2017-08-01 19:40:00  14  B 
#6 2017-08-01 19:50:00  12  B 
#7 2017-08-01 20:00:00  16  B 
#8 2017-08-01 20:10:00  15  NA 
+0

它与原始数据完美配合!谢谢!!! <3 <3 – NeReiS

+0

干杯!乐于帮助 –

0

我试着用在sqldfinner join和它似乎工作:

library(sqldf) 
df3 = sqldf("select df.*, df2.factor2 from df inner join df2 where df.date >= df2.start and df.date <= df2.end") 
result = merge(df, df3, by = "date", all.x = TRUE) 

(请注意,我也试图与left outer join代替inner join,但是这给了我同样的结果inner join ...它必须在sqldf侥幸)

+0

我不能” t使它与原始数据一起工作: rsqlite_send_query(conn @ ptr,语句)错误:near“。”:语法错误 虽然也许是因为我的数据有“。”在因素名称中更改“。”为“$”,但得到了然后 在rsqlite_send_query(conn @ ptr,语句)错误:附近“,”:语法错误 也许这个解决方案toooooo超过我的超级基本知识,以适应我的数据电视。 非常感谢您的回复! :) – NeReiS

相关问题