我有一个包含两个列transid
和item
的csv文件。它具有以下值
1 232
1 123
1 232
1 234
1 435
2 435
2 453
2 454
我想将其转换为这种格式。
232 123 232 234 435
在第一行中
第二行435 453 454
基本上第一列给出了事务id,第二列给出了该事务id中的产品,所以我想将它转换为每个事务的一行与所有产品...
答案 0 :(得分:1)
数据框:
dat <- read.table(text = "1 232
1 123
1 232
1 234
1 435
2 435
2 453
2 454")
names(dat) <- c("transid", "item")
您可以使用tapply
转置(t
)item
中每个唯一transid
的值。 rbind.fill.matrix
包中的函数plyr
可用于组合行。
library(plyr)
rbind.fill.matrix(tapply(dat$item, dat$transid, t))
# 1 2 3 4 5
# [1,] 232 123 232 234 435
# [2,] 435 453 454 NA NA
答案 1 :(得分:1)
尝试以下(使用@Svens数据集)
library(stringi)
stri_list2matrix(split(dat$item, dat$transid), byrow = TRUE)
# [,1] [,2] [,3] [,4] [,5]
# [1,] "232" "123" "232" "234" "435"
# [2,] "435" "453" "454" NA NA
答案 2 :(得分:1)
base R
选项是将列表(“lst”)元素的长度('length<-'
)分配给元素的最大长度(max(sapply(lst,..)
)。这将为那些长度小于最大值的元素填充NAs。
lst <- split(dat$item, dat$transid)
t(sapply(lst, `length<-`, max(sapply(lst, length))))
# [,1] [,2] [,3] [,4] [,5]
#1 232 123 232 234 435
#2 435 453 454 NA NA
dat <- structure(list(transid = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L),
item = c(232L, 123L, 232L, 234L, 435L, 435L, 453L, 454L)), .Names =
c("transid", "item"), class = "data.frame", row.names = c(NA, -8L))