我的原始数据集
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
这样的标题?我通过这个函数处理了数百万行。
如果需要,我可以使用其他功能。请帮忙。
答案 0 :(得分:0)
如果所需的输出是'矩阵',我们可以使用stri_list2matrix
中的stringi
,NAs
将#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}}