使用当前data.frame中的日期在一个data.frame中查找值以在另一个data.frame中创建列

时间:2014-12-02 13:22:06

标签: r date dataframe lookup addition

我尝试从一个data.frame中选择信息以导入另一个data.frame的列。要选择的值可以按行和列标识,并且取决于输出data.frame的现有列的​​计算。我因为有很多步骤要结合而陷入困境,尽管已将其分解并使部件合作,但我无法将最终组合结合在一起。

我的查询数据框架的形式如下:

Date.Time <- rep(c("2014/05/06_pm", "2014/05/07_am", "2014/05/07_pm", "2014/05/08_am"), 4)
Nest <- c(rep("WTSN08", 4), rep("WTSN26", 4), rep("WTSN07", 4), rep("WTSN06", 4))
value <- c(25, 24, 26, 25, 27, 27, 28, 26, 21, 23, 21, 20, 25, 28, 26, 28)
df <- data.frame(Date.Time, Nest, value)
library(reshape)
Lookup <- cast(df, Nest ~ Date.Time, row.names = FALSE)

我的输出data.frame的格式为:

Nest <- rep(c("WTSN08","WTSN26","WTSN07","WTSN06"), 2)
Hatch <- as.Date(rep(c("2014/04/28", "2014/04/29", "2014/04/29", "2014/04/25"),2))
Age <- c(9.5, 8.0, 8.5, 13.0, 10.0, 9.5, 9.5, 12.0)
Output <- data.frame(Nest, Hatch, Age)

我需要做的是创建一个新列Output$T-1,将Output$Age添加到Output$Hatch中给出的日期,识别年龄结束于&#34; .5&# 34;作为下午,并返回Lookup中的值,该值与输出中读取的时间段之前相对应,例如:

对于WTSN08:2014/04/28 + 9.5 = 2014/05/07_pm;因此,在2014/05/07_am = 24

时返回WTSN08的值

第二列将计算相同的内容,但返回之前的2个时间段的值(例如,上述的2014/05 / 06_pm)。

我找到了

Output$Hatch + Output$Age

将输出正确的日期,

paste(as.character(Output$Hatch + Output$Age), "am", sep = "_")

将追加&#34; _am&#34;到某个日期,这样可以查找一个值

Lookup[Lookup$Nest == "WTSN08",as.character(paste(as.character(Output$Hatch + Output$Age), "am", sep = "_"))]

那个

grepl("^.+(.5)$",Output$Age)

将返回以&#34; .5&#34;

结尾的年龄的位置

我试图将它包装在ifelse命令中,最初只是获取计算时间段的值(而不是担心减去天数),以形成列:

Output$T <- ifelse(grepl("^.+(.5)$",WTS_w$Age),
    Max.Ts[Max.Ts$Nest == as.character(WTS_w$Nest), paste(as.character(WTS_w$Hatch + WTS_w$Age), "pm", sep = "_")],
    Max.Ts[Max.Ts$Nest == as.character(WTS_w$Nest), paste(as.character(WTS_w$Hatch + WTS_w$Age), "am", sep = "_")]
)

或使用&#34;匹配&#34;行查找,但无济于事。

有人可以帮忙吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我认为让用户知道我已经解决了这个问题可能会提供信息。

我最终将Lookup data.frame留在熔化的格式中,即:

df <- data.frame(Date.Time, Nest, value)

然后我使用paste来合并NestDate.Time

paste(df$Nest, df$Date.Time, sep = "_")

这样,在我已经实现的添加之后,它们可以与Output data.frame匹配。

将其与ifelse包含在match中的Output$T <- df$value[match(ifelse(grepl("^.+(.5)$",Output$Age), paste(Output$Nest, as.character(Output$Hatch + Output$Age), "pm", sep = "_"), paste(Output$Nest, as.character(Output$Hatch + Output$Age), "am", sep = "_")) ,paste(df$Nest, df$Date.Time, sep = "_"))] 命令放在一起,得出当前时间段的值:

Output$T1 <- df$value[match(ifelse(grepl("^.+(.5)$",Output$Age),
                                   paste(Output$Nest, as.character(Output$Hatch + Output$Age), "am", sep = "_"),
                                   paste(Output$Nest, as.character(Output$Hatch + Output$Age -1), "pm", sep = "_"))
                                   ,paste(df$Nest, df$Date.Time, sep = "_"))]

要获取上一个时段的值,我调整了代码:

{{1}}