R ---逐行填充矩阵和未确定的NA

时间:2017-12-05 18:01:42

标签: r dataframe matrix na

我正在尝试使用数据样本填充矩阵:

       Pays NbChambre Prix
1    Grèce        56  390
2    Grèce       471  468
3    Grèce        93  427
4    Grèce        56  369
5    Grèce       286  499
6    Grèce       282  526
7    Grèce       310  587
8    Grèce       300  534
9     Maroc       146  447
10    Maroc       250  482
11    Maroc       196  511
12    Maroc       324  532
13    Maroc       138  450
14    Maroc       400  569
15    Maroc       366  419
16    Maroc       300  421
17    Maroc       144  579
18    Maroc       330  598
19    Maroc       260  495
20    Maroc       170  730
21 Portugal       254  646
22 Portugal       140  652
23 Portugal       273  802
24 Portugal       260  761
25 Portugal       169 1101
26  Tunisie       225  434
27  Tunisie       225  489
28  Tunisie       250  436
29  Tunisie       550  399
30  Tunisie       800  477
31  Tunisie       150  375
32  Tunisie       425  486
33  Tunisie       366  447
34  Tunisie       200  473
35  Tunisie       130  495
36  Turquie       500  617
37  Turquie        50  489
38  Turquie       232  520
39  Turquie       110  534

我需要以某种方式用向量NbChambre BUT的值填充矩阵 每行用于某个Pays。矩阵的尺寸为

nrow=length(unique(Pays)),ncol=max(table(Pays))

我需要找到一种填充矩阵的方法,例如R自动放置 当数据不足时,NA或0或其他任何内容完成一行,然后跳过行继续向量NbChambre。我对R来说比较新,所以我似乎无法找到任何办法。

结果应该是

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]   56  471   93   56  286  282  310  300  NA   NA    NA     NA
[2,]  146 250  196  324  138  400  366  300  144   330   260    170 
[3,]  254  140   273  260  169 NA   NA   NA   NA    NA    NA    NA
[4,]   
[5,]                             and so on

我真的很想如果有人可以帮助我,谢谢你!

2 个答案:

答案 0 :(得分:4)

dplyr + tidyr的解决方案:

library(dplyr)
library(tidyr)

df %>%
  select(-Prix) %>%
  group_by(Pays) %>%
  mutate(ID = row_number()) %>%
  spread(ID, NbChambre) %>%
  ungroup() %>%
  select(-Pays) %>%
  as.matrix()

使用data.table的另一种方法:

library(data.table)

setDT(df)[,ID := rowid(Pays)]
as.matrix(dcast(df, Pays ~ ID, value.var = "NbChambre")[,Pays := NULL])

<强>结果:

    1   2   3   4   5   6   7   8   9  10  11  12
1  56 471  93  56 286 282 310 300  NA  NA  NA  NA
2 146 250 196 324 138 400 366 300 144 330 260 170
3 254 140 273 260 169  NA  NA  NA  NA  NA  NA  NA
4 225 225 250 550 800 150 425 366 200 130  NA  NA
5 500  50 232 110  NA  NA  NA  NA  NA  NA  NA  NA

数据:

df = structure(list(Pays = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L
), .Label = c("Grèce", "Maroc", "Portugal", "Tunisie", "Turquie"
), class = "factor"), NbChambre = c(56L, 471L, 93L, 56L, 286L, 
282L, 310L, 300L, 146L, 250L, 196L, 324L, 138L, 400L, 366L, 300L, 
144L, 330L, 260L, 170L, 254L, 140L, 273L, 260L, 169L, 225L, 225L, 
250L, 550L, 800L, 150L, 425L, 366L, 200L, 130L, 500L, 50L, 232L, 
110L), Prix = c(390L, 468L, 427L, 369L, 499L, 526L, 587L, 534L, 
447L, 482L, 511L, 532L, 450L, 569L, 419L, 421L, 579L, 598L, 495L, 
730L, 646L, 652L, 802L, 761L, 1101L, 434L, 489L, 436L, 399L, 
477L, 375L, 486L, 447L, 473L, 495L, 617L, 489L, 520L, 534L)), .Names = c("Pays", 
"NbChambre", "Prix"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39"))

答案 1 :(得分:3)

这是使用splitsapply的另一种可能性:

l = split(df$NbChambre,df$Pays)
m = max(lengths(l))
res = t(sapply(l,function(x) x[1:m]))
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
Grèce     56  471   93   56  286  282  310  300   NA    NA    NA    NA
Maroc     146  250  196  324  138  400  366  300  144   330   260   170
Portugal  254  140  273  260  169   NA   NA   NA   NA    NA    NA    NA
Tunisie   225  225  250  550  800  150  425  366  200   130    NA    NA
Turquie   500   50  232  110   NA   NA   NA   NA   NA    NA    NA    NA