Вот проблема, которую я пытаюсь решить. Скажем, у меня есть два кадра данных, таких как следующие:R: подмножество кадра данных на основе условий из другого фрейма данных
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
, которая связывает кадры данных. Я хочу иметь measurement
s от observationss for which
время is between
time1 and
time2 from the
sampletimes data frame. Additionally, I'd like to connect the appropriate
location` для каждого измерения.
Я успешно сделал это путем преобразования моей sampletimes
в широкий формат (т.е. всех time1
и time2
информации в одной строке на запись для id
), слияние двух кадров данных переменной id
, и с помощью условных операторов взять только случаи, когда time
находится между по меньшей мере одним из временных интервалов в строке и затем назначает location
на соответствующее измерение.
Однако у меня около 2 миллионов строк в observations
, и это занимает очень много времени. Я ищу лучший способ хранения данных в длинном формате. Примерный набор данных очень прост, но на самом деле мои данные содержат переменные числа интервалов и местоположений на 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
Первоначально это решение работало. Однако, когда я увеличил размер кадра данных наблюдений примерно до 5 миллионов строк, он не сработал. Я получил следующую ошибку: «Ошибка: слишком сложная оценка: бесконечная рекурсия/параметры (выражения =)?». Каждая другая команда, которую я пробовала, выдает такое же сообщение об ошибке. – Jota
@Frank Я редактирую свое решение, чтобы предоставить решение data.table. сообщите мне, если вы получите ту же ошибку. – agstudy
Мои времена были в формате POSIXlt, и это не сработало, поскольку 'data.table' не поддерживает POSIXlt. Как только я преобразовал свои столбцы времени в POSIXct, он сработал. – Jota