我想将数据从长格式更改为宽格式但有各种变量

时间:2017-06-02 05:32:10

标签: r

我目前的数据采用以下格式

$('#toggle').click(function() {
$(this).toggleClass('active');
$('#overlay').toggleClass('open');
$('body').css('overflow', 'hidden');
});

但我希望它作为一种矩阵

ID  ID_2    Item ID Final Amount
001 111 1111    34623
001 111 1112    42567
001 112 1113    1254
001 112 1114    45237
001 112 1115    42913
001 112 1116    28117
001 113 1117    10312
008 222 1118    27367
008 222 1119    24714
008 223 1120    30949
011 333 1121    49529
012 444 1122    29762
012 444 1123    2743
012 444 1124    21357
012 444 1125    16256
012 444 1126    18376
017 555 1127    7877
017 555 1128    10684
017 555 1129    25281

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:1)

我们可以通过ID' ID_2'创建一个序列列来实现这一点,dcast来自data.table

更容易
library(data.table)
dcast(setDT(df1), ID + ID_2 ~paste0("Item", rowid(ID, ID_2)), value.var = "FinalAmount")
#    ID ID_2 Item1 Item2 Item3 Item4 Item5
#1:  1  111 34623 42567    NA    NA    NA
#2:  1  112  1254 45237 42913 28117    NA
#3:  1  113 10312    NA    NA    NA    NA
#4:  8  222 27367 24714    NA    NA    NA
#5:  8  223 30949    NA    NA    NA    NA
#6: 11  333 49529    NA    NA    NA    NA
#7: 12  444 29762  2743 21357 16256 18376
#8: 17  555  7877 10684 25281    NA    NA

或者可以使用tidyverse

完成此操作
library(tidyverse)
df1 %>% 
   group_by(ID, ID_2) %>% 
   mutate(Seq = paste0("Item", row_number())) %>%
   select(-ItemID) %>%
   spread(Seq, FinalAmount)
# A tibble: 8 x 7
# Groups: ID, ID_2 [8]
#     ID  ID_2 Item1 Item2 Item3 Item4 Item5
#* <int> <int> <int> <int> <int> <int> <int>
#1     1   111 34623 42567    NA    NA    NA
#2     1   112  1254 45237 42913 28117    NA
#3     1   113 10312    NA    NA    NA    NA
#4     8   222 27367 24714    NA    NA    NA
#5     8   223 30949    NA    NA    NA    NA
#6    11   333 49529    NA    NA    NA    NA
#7    12   444 29762  2743 21357 16256 18376
#8    17   555  7877 10684 25281    NA    NA

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 8L, 8L, 8L, 
11L, 12L, 12L, 12L, 12L, 12L, 17L, 17L, 17L), ID_2 = c(111L, 
111L, 112L, 112L, 112L, 112L, 113L, 222L, 222L, 223L, 333L, 444L, 
444L, 444L, 444L, 444L, 555L, 555L, 555L), ItemID = 1111:1129, 
FinalAmount = c(34623L, 42567L, 1254L, 45237L, 42913L, 28117L, 
10312L, 27367L, 24714L, 30949L, 49529L, 29762L, 2743L, 21357L, 
16256L, 18376L, 7877L, 10684L, 25281L)), .Names = c("ID", 
"ID_2", "ItemID", "FinalAmount"), class = "data.frame", row.names = c(NA, 
 -19L))