R:根据另一个数据框的条件对数据框进行子集化

标签 r dataframe subset

这是我要解决的问题。比如说,我有两个如下所示的数据框:

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 中获取 measurements,time 介于 time1time2 之间采样时间数据框。此外,我想将适当的location` 连接到每个测量值。

我已经通过将我的 sampletimes 转换为宽格式(即所有 time1time2 信息在每个条目的一行中成功地做到了这一点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/

相关文章:

r - 从数据帧起点和终点查找间隔

r - %in% : exclude rows with values specified in a vector 相反

r - 如何根据前一行过滤行并使用 dplyr 保留前一行?

r - lapply 与回归模型的多个列表和函数

r - 仅在某些方面 ggplot 中添加注释(段/箭头)

python - 如何从数据框 Pandas 制作列表列表?

r - 查找包含超过 5 个 NA 值的列的索引

ggplot2 中的圆角?

r - 删除轴标签后如何使 R 图居中

python - 从 Pandas 中的 groupby .agg() 或 .apply() 有效地创建全新的数据框?