5

時系列を含む 2 つのデータ フレームがあります (時間は時間オブジェクトではなく数値としてコード化されており、時間は並べ替えられていません)。あるデータ フレームの応答変数を別のデータ フレームの応答変数に正規化したいと考えています。問題は、2 つのデータ フレームのタイムポイントが完全に一致しないことです。したがって、2 つの時間列の近似一致によって 2 つのデータ フレームをマージする必要があります。

データは次のようになります。

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

便利なようapproxですapproxfunが、その方法がよくわかりません。

4

2 に答える 2

7

fromzoo でこれを簡単に行うことができますna.approx:

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 は、最終結果に からのすべてを含める必要があり、列に からの値があるdf2かどうかを気にしない場合に、これを行うための優れた方法を提供しました。t1t2

ただし、これらのことを回避し、@BrandonBertelsen によって提案された方法で続行したい場合は、カスタムround関数を定義してから、それを 2 番目のマージ列で使用できます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 に答える