Сортировка данных через оператор if в R - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть большой CSV данных о тренировках, извлеченных из файлов GPX, состоящих из 6 столбцов:

1. Нет (например, (от 1 до ~ 900 тысяч)

2. широта (например, 34.105329,

3. долгота (например, -118.299236),

4. высота (в метрах,

5. дата (например, 20.10.2017),

6. время (2:08) : 05:00)

Я хотел бы установить sh столбец, в котором указан номер тренировки, например, тренировка 1 охватывает строки с 1 по 2000, а тренировка 2 охватывает строки с 2001 по 5000. Мне удалось выполнить sh в Excel с оператором If, но не выяснили, как это сделать sh это в R.

Excel Snapshot with Code Snippet

В основном, если точка данных был записан в тот же день И в течение двух часов после предыдущей точки данных, обе точки принадлежали к одной и той же тренировке.Если точки данных были зарегистрированы в один и тот же день, но были разделены более чем на 2 часа, они принадлежат двум сент тренировочные тренировки. Ниже я вставил некоторые данные, которые включают первые несколько строк Workout 1 и первые несколько строк Workout 2 (достаточно, чтобы продемонстрировать, как работает формула Excel).

Код выхода:

dput(droplevels(mydata[1:10, ]))

Выход выхода:

structure(list(No = 1:10, Latitude = c(34.092483, 34.092534, 
34.092573, 34.092624, 34.092652, 34.092684, 34.092712, 34.092742, 
34.092774, 34.092808), Longitude = c(-118.300414, -118.300448, 
-118.300434, -118.300431, -118.300428, -118.300425, -118.300423, 
-118.300425, -118.300426, -118.300427), Altitude = c(104.2, 104.2, 
104.3, 104.4, 104.4, 104.5, 104.5, 104.5, 104.6, 104.6), Date = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "10/20/2017", class = "factor"), 
    Time = structure(1:10, .Label = c("1:40:18", "1:43:06", "1:43:08", 
    "1:43:10", "1:43:11", "1:43:12", "1:43:13", "1:43:14", "1:43:15", 
    "1:43:16"), class = "factor")), row.names = c(NA, 10L), class = "data.frame")

Пример данных:

No  Latitude    Longitude   Altitude    Date    Time    Workout#
1   34.092483   -118.300414 104.2   10/20/2017  1:40:18 1
2   34.092534   -118.300448 104.2   10/20/2017  1:43:06 1
3   34.092573   -118.300434 104.3   10/20/2017  1:43:08 1
4   34.092624   -118.300431 104.4   10/20/2017  1:43:10 1
5   34.092652   -118.300428 104.4   10/20/2017  1:43:11 1
1332    34.092487   -118.300577 104.1   11/4/2017   1:23:24 2
1333    34.092513   -118.300565 104.2   11/4/2017   1:23:25 2
1334    34.09255    -118.30053  104.3   11/4/2017   1:23:26 2
1335    34.092592   -118.300495 104.4   11/4/2017   1:23:28 2
1336    34.092619   -118.300481 104.4   11/4/2017   1:23:29 2
1337    34.092668   -118.300467 104.5   11/4/2017   1:23:31 2

Редактировать: Спасибо @AllanCameron и @GregorThomas. Я запустил ваш код и суммировал его, используя приведенный ниже код, который дает желаемые результаты.

cumsum <- cumsum(c(1, as.numeric(diff(workout_times) > 7200)))
# Add 'cumsum' to 'mydata' data frame
mydata$cumsum <- cumsum
sqldf("select distinct(cumsum) from mydata") 

1 Ответ

2 голосов
/ 14 апреля 2020

Предполагая, что ваши тренировки разнесены более чем на 30 минут, вы можете сделать следующее:

workout_times <- as.POSIXct(paste(df$Date, df$Time), format = "%m/%d/%Y %H:%M:%S")
cumsum(c(1, as.numeric(diff(workout_times) > 1800)))
#> [1] 1 1 1 1 1 2 2 2 2 2 2

Вы можете изменить 1800 на количество секунд между тренировками, которые кажутся вам наиболее подходящими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...