拆分R中的数据集

时间:2016-10-12 12:12:56

标签: r

我有一个数据集,其中包含以下格式的Billno和Product列:

Billno Product
1       123
1       176
2       189
3       1
3       2
3       44
3       46

输出应该是以下形式的表:

Billno  Prod1  Prod2  Prod3  Prod4
1       123    176
2       189
3       1      2      44      46

拆分功能有效但数据集包含超过百万条记录。有没有一种有效的方法呢?

3 个答案:

答案 0 :(得分:2)

使用dplyr:

library(dplyr)
library(tidyr)

bill <- rep(c(1,1,2,3,3,3,3),5)
prod <- rep(c(123,176,189, 1,2,44,46),5)

df <- data.frame(bill=bill, prod=prod)
#determine max product count (number of columns in result)
prodmax <- df %>% group_by(bill) %>% summarise(n = n())

df %>% group_by(bill) %>% 
  mutate(prodn = paste0("prod",row_number())) %>% 
  spread(prodn, prod) %>% 
#select columns in correct order
  select_(.dots = c('bill',paste0('prod',seq(1,max(prodmax$n)))))

结果:

      bill  prod1 prod2 prod3 prod4
(dbl) (dbl) (dbl) (dbl) (dbl)
1     1       123   176    NA    NA
2     2       189    NA    NA    NA
3     3         1     2    44    46

答案 1 :(得分:0)

你可以做到

df <- read.table(header=T, text="Billno Product
1       123
1       176
2       189
3       1
3       2
3       44
3       46")
lst <- split(df[,-1], df[,1])
lst <- lapply(lst, "length<-", max(lengths(lst)))
df <- as.data.frame(do.call(rbind, lst))
#    V1  V2 V3 V4
# 1 123 176 NA NA
# 2 189  NA NA NA
# 3   1   2 44 46

然后

names(df) <- sub("V", "prod", names(df))
df$billno <- rownames(df)

答案 2 :(得分:0)

这也可以:

l <- lapply(split(df, df$Billno), function(x) t(x)[2,])
df <- as.data.frame(do.call(rbind, lapply(lapply(l, unlist), "[",
                      1:(max(unlist(lapply(l, length)))))))
names(df) <- paste('Prod', 1:ncol(df), sep='')
df
     Prod1 Prod2 Prod3 Prod4
1   123   176    NA    NA
2   189    NA    NA    NA
3     1     2    44    46