我的数据看起来像这样,可变日的范围是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
答案 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))
而且,可以很容易地用factor
或data.table::rbindlist
替换它(没有dplyr::bind_rows
的风险。)