R 我想将我的数据从长格式更改为宽格式,但存在各种变量
我当前的数据格式如下R 我想将我的数据从长格式更改为宽格式,但存在各种变量,r,R,我当前的数据格式如下 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 1
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
但我希望它是一种矩阵
ID ID_2 Item_1 Item_2 Item_3 Item_4 Item_5
1 111 34623 42567
1 112 1254 45237 42913 28117
1 113 10312
8 222 27367 24714
8 223 30949
11 333 49529
12 444 29762 2743 21357 16256 18376
17 555 7877 10684 25281
有人能帮我吗?我们可以通过“ID”,“ID_2”创建一个序列列来实现这一点,使用
dcastfromdata.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
库(tidyverse)
df1%>%
分组人(ID,ID 2)%>%
突变(Seq=paste0(“项”,行号())%>%
选择(-ItemID)%%>%
价差(序号、最终金额)
#一个tibble:8x7
#分组:ID,ID_2[8]
#ID_2项目1项目2项目3项目4项目5
#*
#111134623 42567 NA NA NA NA
#211212544523742913 28117北美
#31111310312不适用不适用不适用不适用不适用
#4 8 222 27367 24714 NA NA NA NA
#5 8 223 30949纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳
#611333349529NA NA NA NA
#7 12 444 29762 2743 21357 16256 18376
#81755578771068425281纳
数据
df1无需在rowid
imo中包含ID
;使用dcast(setDT(df1),ID+ID\u 2~rowid(ID\u 2,前缀='Item'),value.var=“FinalAmount”)
的工作原理与well@Jaap它可以工作,但在完整数据中可能需要它我的数据超过9L行,因此它给出了一个错误:无法分配大小为58.4 Gb的向量。@dineshkhemani这是因为您的系统没有执行此操作的内存。如果内存是一个问题,您可能必须在服务器上执行此操作。我没有在服务器上执行此操作的选项。您能推荐一种可以在系统内存上执行的解决方案吗?感谢在base R中,您可以在创建如下项计数变量后使用重塑
:df1$times错误:无法分配大小为2.9 Gb的向量
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))