объединить данные на основе определенной последовательности - PullRequest
0 голосов
/ 11 февраля 2019

мои данные выглядят таким образом, и переменная день колеблется от 1 до 232. Это просто более короткая версия данных, реальные данные имеют более 20000000 строк с переменной «день» в диапазоне от 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 после них, затем extracr day = 1 и затем rbind.Например, первые 4 последовательности должны выглядеть следующим образом:

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Метод 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

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

Кроме того, его можно легко заменить (без риска factor с) на data.table::rbindlist или dplyr::bind_rows.

0 голосов
/ 11 февраля 2019

Если я правильно понимаю, вы можете сделать это довольно простым способом с помощью 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

Создано в 2019-02-10 с помощью пакета Представить (v0.2.1)

...