转置矩阵

时间:2015-01-28 08:18:23

标签: r

我有一个包含两个列transiditem的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中的产品,所以我想将它转换为每个事务的一行与所有产品...

3 个答案:

答案 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转置(titem中每个唯一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))