根据特定顺序合并数据

时间:2019-02-11 04:08:13

标签: r loops concatenation rbind

我的数据看起来像这样,可变日的范围是1到232。这只是数据的较短版本,实际数据有超过2000万行,可变“天”的范围是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,然后重新计算。例如,前4个序列应如下所示:

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

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您可以使用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创建

答案 1 :(得分:2)

Base 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))

而且,可以很容易地用factordata.table::rbindlist替换它(没有dplyr::bind_rows的风险。)