通过R转置数据集

时间:2015-03-29 19:48:21

标签: r

我的原始数据集

Transaction   Item   Amount   
       1001    200       14
       1001    201       13
       1001    202       16
       1001    205       17
       1002    300       11
       1002    305       12
       1002    200       30

我根据一些专家建议使用以下代码。

by(dx,dx$Transaction,function(x)c(x$Item,sum(x$Amount),x$Amount))

我目前的输出是......

dx$Transaction: 1001
[1] 200 201 202 205  60  14  13  16  17
------------------------------------------------------------------------------- 
dx$Transaction: 1002
[1] 300 305 200  53  11  12  30

但我想要的是

200 201 202 205  60  14  13  16  17
300 305 200  53  11  12  30

是否有可能摆脱像...... dx$Transaction: 1001这样的标题?我通过这个函数处理了数百万行。

如果需要,我可以使用其他功能。请帮忙。

1 个答案:

答案 0 :(得分:0)

如果所需的输出是&#39;矩阵&#39;,我们可以使用stri_list2matrix中的stringiNAs#your code l1 <- by(dx,dx$Transaction,function(x)c(x$Item,sum(x$Amount),x$Amount)) library(stringi) m1 <- stri_list2matrix(l1, byrow=TRUE) matrix(as.numeric(m1), ncol=ncol(m1)) # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] #[1,] 200 201 202 205 60 14 13 16 17 #[2,] 300 305 200 53 11 12 30 NA NA 填充到长度不等的列表元素并转换&#39;列表&#39;到&#39;矩阵&#39;。

lapply(seq_along(l1), function(i) l1[[i]])
#[[1]]
#[1] 200 201 202 205  60  14  13  16  17

#[[2]]
#[1] 300 305 200  53  11  12  30

如果您希望将其保留在列表中并只删除属性,则可采用

方式
attr(l1, 'dimnames') <- NULL
attr(l1, 'class') <- NULL
attr(l1, 'call') <- NULL
l1
#[[1]]
#[1] 200 201 202 205  60  14  13  16  17

#[[2]]
#[1] 300 305 200  53  11  12  30

或者将属性分配给NULL

dx <- structure(list(Transaction = c(1001L, 1001L, 1001L, 1001L, 
1002L, 
1002L, 1002L), Item = c(200L, 201L, 202L, 205L, 300L, 305L, 200L
), Amount = c(14L, 13L, 16L, 17L, 11L, 12L, 30L)), 
.Names = c("Transaction", 
"Item", "Amount"), class = "data.frame", row.names = c(NA, -7L))

数据

{{1}}