我有一个数据集,其中包含以下格式的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
拆分功能有效但数据集包含超过百万条记录。有没有一种有效的方法呢?
答案 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