2015-04-02 34 views
3

我想下面的數據幀如何將兩列數據框重新整形爲寬格式?

x <- structure(
    list(name = c("HT", "AT", "HG", "AG"), 
     conv = c(2L, + 2L, 3L, 4L)), 
    .Names = c("name", "conv"), row.names = 1:4, class = "data.frame") 

> x 
    name conv 
1 HT 2 
2 AT 2 
3 HG 3 
4 AG 4 

重塑成

conv x.1 x.2 
1 2 HT AT 
2 3 HG NA 
3 4 AG NA 

在最後的數據幀應該有針對 conv每個不同值的行,以及多達x.?列,因爲在原始數據 幀中對於該特定值conv的行,在必要時用NA填充。我不在乎列名。

我試圖reshape但我不能得到它的工作,因爲它似乎需要 ,我沒有第三列:

> reshape(x, idvar='conv', direction='wide') 
Error in `[.data.frame`(data, , timevar) : undefined columns selected 

回答

2

有些事情,你可以嘗試:

xmax <- max(table(x$conv)) 
xsplit <- split(x, x$conv) 
xsplit <- sapply(xsplit, function(tab){c(tab$name, rep(NA, xmax-length(tab$name)))}) 
x2 <- data.frame(conv=x$conv[!duplicated(x$conv)], t(xsplit), stringsAsFactors=F) 
colnames(x2)[-1]<-paste("x",1:xmax,sep=".") 
x2 
# conv x.1 x.2 
#2 2 HT AT 
#3 3 HG <NA> 
#4 4 AG <NA> 

NB:隨着重塑,你可以做下面的事情,但我不認爲這就是你想要的。可能有一些參數來設置,所以你得到你想要的東西,但我真的不是一個reshape專家:-(

reshape(data=x, v.names="name", timevar="name", idvar="conv", direction="wide") 
# conv name.HT name.AT name.HG name.AG 
#1 2  HT  AT <NA> <NA> 
#3 3 <NA> <NA>  HG <NA> 
#4 4 <NA> <NA> <NA>  AG 
3

使用data.table v1.9.5

require(data.table) 
dcast(setDT(x), conv ~ paste0("x.", x[, seq_len(.N), by=conv]$V1), value.var="name") 
# conv x.1 x.2 
# 1: 2 HT AT 
# 2: 3 HG NA 
# 3: 4 AG NA 

您可以按照說明進行安裝here

相關問題