4

次のような2つのデータフレームがあります。

df1 <- data.frame(time=seq(0.0, by = 0.003, length.out = 1000))

   time
1 0.000
2 0.003
3 0.006
4 0.009
5 0.012
6 0.015
...

df2 <- data.frame(onset=c(0.0, 0.8, 1.9, 2.4), offset=c(0.799, 1.899, 2.399, 3.0))

  onset offset   A   B
1   0.0  0.799 ... ...
2   0.8  1.899 ... ...
3   1.9  2.399 ... ...
4   2.4  3.000 ... ...

実際には、各データフレームにはより多くの列があり、最初のデータフレームにはさらに多くの回数があり、それらは規則的な間隔ではありません。2番目のデータフレームにはそれほど多くの行はありません。最初のデータフレームの各行が2番目のデータフレームから適切な範囲の追加の列を取得するように2つのデータフレームをマージします。また、数十万の行が含まれるため、効率的に実行したいと思います。

4

3 に答える 3

7

を使用findIntervalして、時間を対応するonset、次にmerge2つのdata.framesと一致させることができます。

df1$onset <- df2$onset[findInterval(df1$time, df2$onset)]
df3 <- merge(df1, df2, by = "onset")

head(df3)
#   onset  time offset
# 1     0 0.000  0.799
# 2     0 0.003  0.799
# 3     0 0.006  0.799
# 4     0 0.009  0.799
# 5     0 0.012  0.799
# 6     0 0.015  0.799

tail(df3)
#      onset  time offset
# 995    2.4 2.982      3
# 996    2.4 2.985      3
# 997    2.4 2.988      3
# 998    2.4 2.991      3
# 999    2.4 2.994      3
# 1000   2.4 2.997      3
于 2012-05-06T22:38:10.313 に答える
3

それぞれの係数を準備してから、plyr :: join:を使用できます。

# breaks for 'cut'
times=c(df2$onset[1],df2$offset)

# modified df1 to shorten the list
df1 <- data.frame(time=seq(0.0, by = 0.03, length.out = 100))

# Add a few columns to df2
df2 <- data.frame(onset=c(0.0, 0.8, 1.9, 2.4), offset=c(0.799, 1.899, 2.399, 3.0), A=c(1,2,3,4), B=c(5,6,7,8))


df2$ranges <-cut(df2$onset,times,include.lowest=T))
df1$ranges <-cut(df1$time,times,include.lowest=T,levels=levels(df2$ranges))

join(df1,df2,by='ranges')

head(join(df1,df2,by='ranges')[-2])
  time onset offset A B
1 0.00     0  0.799 1 5
2 0.03     0  0.799 1 5
3 0.06     0  0.799 1 5
4 0.09     0  0.799 1 5
5 0.12     0  0.799 1 5
6 0.15     0  0.799 1 5
于 2012-05-06T22:45:54.980 に答える
1

sqldfを実行するために使用する3番目のオプションconditional join

> head(sqldf("select * 
+            from df1 inner join df2 
+                     on (df1.time between df2.onset and df2.offset)"))

ヘッド出力:

   time onset offset
1 0.000     0  0.799
2 0.003     0  0.799
3 0.006     0  0.799
4 0.009     0  0.799
5 0.012     0  0.799
6 0.015     0  0.799

内部結合は、df2の範囲に収まらない時間を取り除きます。これらの時間を保持し、onsetとoffestにnullを含める場合は、上記の関数のSQLleft joinではなく、単にnullを使用します。inner joinsqldf

于 2012-08-10T05:08:15.857 に答える