问题描述
我的数据类似于下面第一个图表的大得多的版本。我想将它“解开”到第二张图表中,但我无法有效地做到这一点。在底部,我最近进行了尝试,其中 IDVars 基本上是下面的前三列。它运行了 15 分钟,然后我才需要杀死它。
姓名 | ID | 试用 | 变量 | 数量 |
---|---|---|---|---|
名称 1 | 1 | 1 | FinalSalary | 300.00 |
名称 1 | 1 | 1 | FinalDCBalance | 400.00 |
名称 1 | 1 | 2 | FinalSalary | 300.00 |
名称 1 | 1 | 2 | FinalDCBalance | 300.00 |
名称 2 | 2 | 1 | FinalSalary | 400.00 |
名称 2 | 2 | 1 | FinalDCBalance | 400.00 |
名称 2 | 2 | 2 | FinalSalary | 200.00 |
名称 2 | 2 | 2 | FinalDCBalance | 300.00 |
名称 3 | 3 | 1 | FinalSalary | 100.00 |
名称 3 | 3 | 2 | FinalDCBalance | 400.00 |
姓名 | ID | 试用 | FinalSalary | FinalDCBalance |
---|---|---|---|---|
名称 1 | 1 | 1 | 300 | 400 |
名称 1 | 1 | 2 | 300 | 300 |
名称 2 | 2 | 1 | 400 | 400 |
名称 2 | 2 | 2 | 200 | 300 |
名称 3 | 3 | 1 | 100 | 400 |
名称 3 | 3 | 2 | 300 | 100 |
unmelt <- reshape(dataframe,idvar = IDVars,v.names = 'variable',direction = 'wide',timevar = 'Amount')
解决方法
我们可以使用pivot_wider
library(tidyr)
pivot_wider(df1,names_from = 'Variable',values_from = 'Amount')
,
timevar=
应该是 "Variable"
,而不是 "Amount"
。 idvar 列沿着边走,timevar 列沿着顶部走,其他所有内容(金额)作为值进入输出正文。 v.names = "Amount"
可以指定,但它会计算出来,因为这是唯一剩下的列,所以我们省略了它。
r <- reshape(dd,dir = "wide",idvar = c("Name","ID","Trial"),timevar = "Variable")
names(r) <- sub("Amount.","",names(r)) # optional
给予:
> r
Name ID Trial FinalSalary FinalDCBalance
1 Name 1 1 1 300 400
3 Name 1 1 2 300 300
5 Name 2 2 1 400 400
7 Name 2 2 2 200 300
9 Name 3 3 1 100 NA
10 Name 3 3 2 NA 400
注意
可重现形式的输入:
dd <- structure(list(Name = c("Name 1","Name 1","Name 2","Name 3","Name 3"),ID = c(1L,1L,2L,3L,3L),Trial = c(1L,2L),Variable = c("FinalSalary","FinalDCBalance","FinalSalary","FinalDCBalance"),Amount = c(300,400,300,200,100,400)),class = "data.frame",row.names = c(NA,-10L))