5

我有两个包含时间序列的数据帧(时间编码为数字,而不是时间对象;时间未排序)。我想将一个数据帧中的响应变量标准化为另一个数据帧中的响应变量。问题是两个数据帧中的时间点并不完全相同。因此,我需要通过两个时间列的近似匹配来合并两个数据帧。

数据如下所示:

df1 <- structure(list(t1 = c(3, 1, 2, 4), y1 = c(9, 1, 4, 16)), .Names = c("t1", "y1"), row.names = c(NA, -4L), class = "data.frame")
df2 <- structure(list(t2 = c(0.9, 4.1), y2 = structure(1:2, .Label = c("a", "b"), class = "factor")), .Names = c("t2", "y2"), row.names = c(NA, -2L), class = "data.frame")

结果应如下所示:

t1  y1    y2
 1   1    a
 4  16    b

似乎approxapproxfun会很有用,但我不太明白该怎么做。

4

2 回答 2

7

您可以使用na.approxfrom zoo 轻松完成此操作:

library(zoo)
Data <- merge(df1, df2, by.x="t1", by.y="t2", all=TRUE)
Data$y1 <- na.approx(Data$y1, na.rm=FALSE, rule=2)
na.omit(Data)
#    t1 y1 y2
# 1 0.9  1  a
# 6 4.1 16  b

你也可以这样做approx

Data <- merge(df1, df2, by.x="t1", by.y="t2", all=TRUE)
y1.na <- is.na(Data$y1)
Data$y1[y1.na] <- (approx(Data$y1, rule=2, n=NROW(Data))$y)[y1.na]
于 2012-10-16T19:51:55.540 回答
1

@JoshuaUlrich 提供了一种很好的方法来执行此操作,如果您希望最终结果包含 from 的所有内容df2并且您不关心t1列是否具有 from 的值t2

但是,如果您想避免这些事情并按照@BrandonBertelsen 建议的方式继续,您可以定义自定义round函数,然后在第二个的合并列上使用它data.frame。例如:

# define a more precise rounding function that meets your needs.
# e.g., this one rounds values in x to their nearest multiple of h
gen.round <- function(x, h) {
    ifelse(x %% h > (h/2), h + h * (x %/% h), -(h + h * (-x %/% h)))
}

# make a new merge function that uses gen.round to round the merge column 
# in the second data.frame
merge.approx <- function(x, y, by.x, by.y, h, ...) {
    y <- within(y, assign(by.y, gen.round(get(by.y), h)))
    merge(x, y, by.x=by.x, by.y=by.y, ...)
}

merge.approx(df1, df2, by.x='t1', by.y='t2', h =.5)

  t1 y1 y2
1  1  1  a
2  4 16  b
于 2012-10-16T20:42:05.070 回答