这是我要解决的问题。比如说,我有两个如下所示的数据框:
observations <- data.frame(id = rep(rep(c(1,2,3,4), each=5), 5),
time = c(rep(1:5,4), rep(6:10,4), rep(11:15,4), rep(16:20,4), rep(21:25,4)),
measurement = rnorm(100,5,7))
sampletimes <- data.frame(location = letters[1:20],
id = rep(1:4,5),
time1 = rep(c(2,7,12,17,22), each=4),
time2 = rep(c(4,9,14,19,24), each=4))
它们都包含一个名为 id
的列,它链接数据框。我想从 observationss 中获取
timemeasurement
s, 介于
time1 和
time2 之间
采样时间数据框。此外,我想将适当的
location` 连接到每个测量值。
我已经通过将我的 sampletimes
转换为宽格式(即所有 time1
和 time2
信息在每个条目的一行中成功地做到了这一点for id
),通过id
变量合并两个数据帧,并使用条件语句仅在time
介于至少行中的时间间隔之一,然后将 location
分配给适当的测量值。
但是,我在 observations
中有大约 200 万行,这样做需要很长时间。我正在寻找一种更好的方法来以长格式保存数据。示例数据集非常简单,但实际上,我的数据包含每个 id
的可变数量的间隔和位置。
对于我们的示例,我希望返回的数据框如下:
id time measurement letters[1:20]
1 3 10.5163892 a
2 3 5.5774119 b
3 3 10.5057060 c
4 3 14.1563179 d
1 8 2.2653761 e
2 8 -1.0905546 f
3 8 12.7434161 g
4 8 17.6129261 h
1 13 10.9234673 i
2 13 1.6974481 j
3 13 -0.3664951 k
4 13 13.8792198 l
1 18 6.5038847 m
2 18 1.2032935 n
3 18 15.0889469 o
4 18 0.8934357 p
1 23 3.6864527 q
2 23 0.2404074 r
3 23 11.6028766 s
4 23 20.7466908 t
最佳答案
这是一个带有merge
的提案:
# merge both data frames
dat <- merge(observations, sampletimes, by = "id")
# extract valid rows
dat2 <- dat[dat$time > dat$time1 & dat$time < dat$time2, seq(4)]
# sort
dat2[order(dat2$time, dat2$id), ]
结果:
id time measurement location
11 1 3 7.086246 a
141 2 3 6.893162 b
251 3 3 16.052627 c
376 4 3 -6.559494 d
47 1 8 11.506810 e
137 2 8 10.959782 f
267 3 8 11.079759 g
402 4 8 11.082015 h
83 1 13 5.584257 i
218 2 13 -1.714845 j
283 3 13 -11.196792 k
418 4 13 8.887907 l
99 1 18 1.656558 m
234 2 18 16.573179 n
364 3 18 6.522298 o
454 4 18 1.005123 p
125 1 23 -1.995719 q
250 2 23 -6.676464 r
360 3 23 10.514282 s
490 4 23 3.863357 t
关于R:根据另一个数据框的条件对数据框进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165123/