【问题标题】:Create matrix from dataset in R从 R 中的数据集创建矩阵
【发布时间】:2020-04-06 11:40:59
【问题描述】:

我想根据我的数据创建一个矩阵。我的数据由两列组成,日期和我对每个日期的观察。我希望矩阵将年作为行,将天作为列,例如:

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

本例中的天数为每年 12 月。我希望缺失值等于 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

我认为我需要做的第一件事是将日期拆分为年、月和日(欧洲格式,YYYY-MM-DD)所以我这样做并去掉了日期列(那个说Datum) 并且也摆脱了不相关的日子,即

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),]

现在看起来像这样:

> 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 的矩阵中。有没有办法做到这一点?

【问题讨论】:

  • 那么几个月呢?您想在哪里获取月份信息?
  • 月份无关紧要,因为所有的日子都是从 12 月开始的

标签: r matrix


【解决方案1】:

基础 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))))

【讨论】:

  • 我用示例数据尝试了所有代码,效果很好,但后来我自己尝试了:&gt; r &lt;- (do.call(rbind, by(cdata, substr(cdata$Datum, 1, 4), function(x) x[2])), 1:31) Error: unexpected ',' in "r &lt;- (do.call(rbind, by(cdata, substr(cdata$Datum, 1, 4), function(x) x[2])),"
  • "colnames&lt;-"(do.call(rbind, by(cdata, substr(cdata$Datum, 1, 4), function(x) x[2])), 1:31)do.call(rbind, by(cdata, substr(cdata$Datum, 1, 4), function(x) x[2])) - 数数你的括号。
  • 好吧,这样的作品。但是行名只是在 1904 和 1905 之间变化。所以第一行是 1904,第二行是 1905,第三行是 1904,第四行是 1905,依此类推。
【解决方案2】:

你可以试试:

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)

【讨论】:

  • 谢谢!这种工作,但它从第 1 天开始,我只想要 12 月的第 17 - 31 天。它不会将缺失值显示为 NA,而是省略缺失值的日期。
  • @user12221453 你能检查更新的答案,看看它是否有效。
  • 恐怕不行。第一年(1904 年)被省略,观察值似乎是随机的
  • Ok..在这种情况下,请使用dput 给出一个可重现的示例,以便在我们拥有您的数据时更容易提供帮助。 dput(cdata).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多