Создать матрицу из набора данных в R - PullRequest
2 голосов
/ 06 апреля 2020

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

      17   18   19   20   ...   31
1904  x11  x12  ...
1905
1906
.
.
.
2019

Дни в этом случае относятся к декабрю каждого года. Я хотел бы, чтобы пропущенные значения равнялись NA.

Вот пример моих данных:

> head(cdata)
# A tibble: 6 x 2
  Datum               Snödjup
  <dttm>                <dbl>
1 1904-12-01 00:00:00    0.02
2 1904-12-02 00:00:00    0.02
3 1904-12-03 00:00:00    0.01
4 1904-12-04 00:00:00    0.01
5 1904-12-12 00:00:00    0.02
6 1904-12-13 00:00:00    0.02

Я подумал, что первое, что мне нужно сделать, это разделить дату на год, месяц и день (европейское форматирование, ГГГГ-ММ -ДД) так что я сделал это и избавился от столбца даты (тот, который говорит Datum), а также избавился от ненужных дней, а именно те <17 *. 1009 * <pre>cdata %>% dplyr::mutate(year = lubridate::year(Datum), month = lubridate::month(Datum), day = lubridate::day(Datum)) select(cd, -c(Datum)) cu <- cd[which(cd$day > 16 & cd$day < 32 & cd$month == 12),]

и теперь это выглядит как this:

> cu
# A tibble: 1,284 x 4
   Snödjup  year month   day
     <dbl> <dbl> <dbl> <int>
 1    0.01  1904    12    26
 2    0.01  1904    12    27
 3    0.01  1904    12    28
 4    0.12  1904    12    29
 5    0.12  1904    12    30
 6    0.15  1904    12    31
 7    0.07  1906    12    17
 8    0.05  1906    12    18
 9    0.05  1906    12    19
10    0.04  1906    12    20
# … with 1,274 more rows

Теперь мне нужно поместить мои данные в матрицу с пропущенными значениями в виде NA. Есть какой-либо способ сделать это?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Базовый подход R, используя by.

r <- `colnames<-`(do.call(rbind, by(dat, substr(dat$date, 1, 4), function(x) x[2])), 1:31)
r[,17:31]
#         17    18    19   20    21    22    23   24    25    26    27    28   29    30   31
# 1904 -0.28 -2.66 -2.44 1.32 -0.31 -1.78 -0.17 1.21  1.90 -0.43 -0.26 -1.76 0.46 -0.64 0.46
# 1905  1.44 -0.43  0.66 0.32 -0.78  1.58  0.64 0.09  0.28  0.68  0.09 -2.99 0.28 -0.37 0.19
# 1906 -0.89 -1.10  1.51 0.26  0.09 -0.12 -1.19 0.61 -0.22 -0.18  0.93  0.82 1.39 -0.48 0.65

Данные игрушки

set.seed(42)
dat <- do.call(rbind, lapply(1904:1906, function(x) 
  data.frame(date=seq(ISOdate(x, 12, 1, 0), ISOdate(x, 12, 31, 0), "day" ),
             value=round(rnorm(31), 2))))
1 голос
/ 06 апреля 2020

Вы можете попробовать:

library(dplyr)
library(tidyr)

cdata %>%
   mutate(year = lubridate::year(Datum), 
          day = lubridate::day(Datum)) %>%
   filter(day >= 17) %>%
   complete(day = 17:31) %>%
   select(year, day, Snödjup) %>%
   pivot_wider(names_from = day, values_from = Snödjup)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...