根据特定序列连接数据

concatenate data based on a certain sequence

我的数据看起来是这样的,变量天的范围从 1 到 232。这只是数据的一个较短版本,真实数据有超过 20000000 行,变量 'day' 范围从 1 到 232

day time
1   2
1   2
2   2
2   3
3   4
3   5
4   4
4   2

我有一个向量,其中包含 1000 个随机选择的可变日序列 (1-232),比如

df=c(3,4,1,2,...,4,1,3)

我想创建一个根据顺序排序的新数据集。我们首先从数据中提取 day=3,然后提取 day=4,然后提取 day=1 和 rbind。例如,前 4 个序列应如下所示:

day time
3   4
3   5
4   4
4   2
1   2
1   2
2   2
2   3

如果我没理解错的话,你可以使用 data.table():

以非常直接的方式完成此操作
library(data.table)
df <- fread(text = "day time
1   2
1   2
2   2
2   3
3   4
3   5
4   4
4   2", header = TRUE)

seqs <- data.table(day = c(3,4,1,2,4,1,3))

df[seqs, on = "day"]
#>     day time
#>  1:   3    4
#>  2:   3    5
#>  3:   4    4
#>  4:   4    2
#>  5:   1    2
#>  6:   1    2
#>  7:   2    2
#>  8:   2    3
#>  9:   4    4
#> 10:   4    2
#> 11:   1    2
#> 12:   1    2
#> 13:   3    4
#> 14:   3    5

reprex package (v0.2.1)

于 2019-02-10 创建

基础 R 方法:

x <- structure(list(day = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L), time = c(2L, 
2L, 2L, 3L, 4L, 5L, 4L, 2L)), class = "data.frame", row.names = c(NA, 
-8L))
df <- c(3,4,1,2,4,1,3)
do.call("rbind.data.frame", lapply(df, function(i) subset(x, day == i)))
#    day time
# 5    3    4
# 6    3    5
# 7    4    4
# 8    4    2
# 1    1    2
# 2    1    2
# 3    2    2
# 4    2    3
# 71   4    4
# 81   4    2
# 11   1    2
# 21   1    2
# 51   3    4
# 61   3    5

do.call("rbind.data.frame", ...) 的使用容易出现典型的 data.frame 实例化,这意味着如果您的真实数据有任何 character 类型的列,您可能想要

do.call("rbind.data.frame", c(lapply(df, function(i) subset(x, day == i)), stringsAsFactors = FALSE))

此外,它可以很容易地用 data.table::rbindlistdplyr::bind_rows.

替换(没有 factors 的风险)