Выберите строки по условиям в R - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь получить значение из данных с несколькими условиями. Данные, которые я получил, - это 1 файл за 1 месяц, а данные, которые я получил, не были в последовательном времени. Данные выглядят так:

                                        measure       value
1                            Station identifier        WAML
2                                Station number       97072
3                              Observation time 150101/0000
...
27       Mean mixed layer potential temperature      298.68
28                Mean mixed layer mixing ratio       16.77
29                1000 hPa to 500 hPa thickness     5773.00
30  Precipitable water [mm] for entire sounding       55.86
31                           Station identifier        WAML
32                               Station number       97072
33                             Observation time 150109/1200
...
57       Mean mixed layer potential temperature      300.78
58                Mean mixed layer mixing ratio       16.29
59                1000 hPa to 500 hPa thickness     5784.00
60  Precipitable water [mm] for entire sounding       52.46
61                           Station identifier        WAML
62                               Station number       97072
63                             Observation time 150110/0000
...
87       Mean mixed layer potential temperature      297.48
88                Mean mixed layer mixing ratio       16.55
89                1000 hPa to 500 hPa thickness     5760.00
90                           Station identifier        WAML
91                               Station number       97072
92                             Observation time 150110/1200
...

Данные и я хочу отфильтровать по «времени наблюдения» и «осадке воды [мм] для всего звучания», чтобы я мог получить значение. Но бывают случаи, когда в одно время наблюдений нет данных о количестве воды в осадке и только время наблюдения с другими параметрами.

Я пытался использовать:

df1 <-  dplyr::filter(obs.tpw, grepl(paste(c("Observation time", "Precipitable water [mm] for entire sounding"), collapse = "&"), paste(measure, value, sep = "_")))

Но там нет данных,

Как получить данные только по времени наблюдения и параметру Осажденной воды только со значением, а затем упорядочить их в последовательном времени. Значение времени наблюдения составляет 'data'/'time', 150101 - (год) (месяц) (день) / (час) (минута). Данные, которые я получил, не были отсортированы по дате и часам. Например, первое время наблюдения 150101/0000, затем второе время 150109/1200, второе время должно быть 150101/1200, потому что за один день в 2 раза больше наблюдений (0000 и 1200)

Окончательные данные, которые я хочу выглядеть следующим образом:

                                       measure       value
1                             Observation time 150101/0000
2  Precipitable water [mm] for entire sounding       55.86
3                             Observation time 150101/1200
4  Precipitable water [mm] for entire sounding       52.46
5                             Observation time 150102/0000
6  Precipitable water [mm] for entire sounding       61.15
7                             Observation time 150102/1200
8  Precipitable water [mm] for entire sounding       55.93
9                             Observation time 150103/0000
10 Precipitable water [mm] for entire sounding       52.25
11                            Observation time 150103/1200
12 Precipitable water [mm] for entire sounding       61.48
13                            Observation time 150104/0000
14 Precipitable water [mm] for entire sounding          NA
15                            Observation time 150104/1200
16 Precipitable water [mm] for entire sounding       61.92
17                            Observation time 150105/0000
18 Precipitable water [mm] for entire sounding          NA
19                            Observation time 150105/1200
20 Precipitable water [mm] for entire sounding       57.42

1 Ответ

2 голосов
/ 26 марта 2020

Я сделал следующие предположения, которые не были ясны в вашем вопросе выше (я буду при необходимости изменять свой ответ, если они будут неправильными):

  1. Уникальные наблюдения обозначаются комбинацией Station identifier, Station number и Observation time
  2. Каждое наблюдение содержит эти три идентификатора, и они всегда происходят в одном и том же порядке непосредственно перед данными, связанными с этим наблюдением
  3. Я ничего не знаю о формате даты-времени, используемом в Observation time, но я предполагаю, что это что-то вроде 'date'/'time', где 'date' - целочисленная последовательность, которая относится к числу дней после определенной контрольной даты.

Сначала , попробуйте включить воспроизводимый набор данных в эти вопросы или ссылку на общедоступные данные:

# Create Reproducible Dataset ---------------------------------------------
measure <- c("Station identifier", 
             "Station number", 
             "Observation time", "Mean mixed layer potential temperature", 
             "Mean mixed layer mixing ratio", "1000 hPa to 500 hPa thickness",
             "Precipitable water [mm] for entire sounding", "Station identifier", 
             "Station number", "Observation time", 
             "Mean mixed layer potential temperature",
             "Mean mixed layer mixing ratio", "1000 hPa to 500 hPa thickness", 
             "Precipitable water [mm] for entire sounding", "Station identifier", 
             "Station number", "Observation time", 
             "Mean mixed layer potential temperature", 
             "Mean mixed layer mixing ratio", 
             "1000 hPa to 500 hPa thickness", "Station identifier", 
             "Station number", "Observation time")
value <- c("WAML", "97072", "150101/0000", "298.68", "16.77", "5773.00", "55.86", 
           "WAML", "97072", "150109/1200", "300.78", "16.29", "5784.00", "52.46", 
           "WAML", "97072", "150110/0000", "297.48", "16.55", "5760.00", "WAML", 
           "97072", "150110/1200")
df <- data.frame(measure = measure, value = value, stringsAsFactors = FALSE)

Теперь к вашему вопросу:

# Solution ----------------------------------------------------------------

# Create index of rows where `measure == "Station identifier"`
idx <- which(df$measure == "Station identifier")

df %>% 
    # Create Unique Identifier for each station
    dplyr::mutate(station_id = cut(1:nrow(df), 
                                   c(idx, nrow(df)),
                                   right = FALSE, 
                                   include.lowest = TRUE)) %>% 
    dplyr::filter(measure %in% c("Observation time", 
                                 "Precipitable water [mm] for entire sounding")) %>% 
    # Turn each value in measure to a new column
    tidyr::pivot_wider(names_from = "measure", values_from = "value", ) %>% 
    # Inelegant way of sorting by date and time
    dplyr::mutate(ot =  as.numeric(sub("\\/", ".", `Observation time`))) %>% 
    dplyr::arrange(ot) %>% 
    dplyr::select(-ot) %>% 
    tidyr::drop_na()

Наконец, я хотел бы отметить, что, хотя вы, вероятно, сможете анализировать и анализировать эти данные очень хорошо, используя пакеты tidyverse, если ваше поле исследования требуют частого использования геопространственных, пространственно-временных или атмосферных данных c, кажется, уже существует большая коллекция пакетов R, специально созданных для этой цели. У меня нет абсолютно никакого опыта в этом отношении, но из моего краткого поиска пакет spacetime на CRAN кажется многообещающим, поскольку он может обрабатывать данные в этом формате. Еще один ресурс, который может быть полезен - следующий праймер от Edzer Pebesma .

Надеюсь, это полезно.

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