2017-08-08 124 views
0

我在爲r的數據幀DF形式R數據幀壓扁/重塑

a,1 
a,4 
a,2 
b,6 
b,8 
b,4 
c,4 
c,5 
c,2 

我要代表DF形式

a,1,4,2 
b,6,8,4 
c,4,5,2 

什麼是更快的方式做到這一點的R中的轉換,尤其是如果我的數據幀的大小更大?

+0

這的確是一個[長寬欺騙(HTTPS: //stackoverflow.com/questions/5890584/how-to-reshape-data-from-long-to-wide格式),但沒有列名或足夠唯一的索引。它都是可以修復的,例如'庫(tidyverse); %var%>%set_names(paste0('V',1:2))%>%group_by(V1)%>%mutate(var = paste0('X',row_number()))%>%spread(var,V2 )' – alistaire

回答

1

通過使用dplyrreshape2

library(dplyr) 
library(reshape2) 
dat=dat%>%group_by(V1)%>%dplyr::mutate(id=row_number()) 
as.data.frame(acast(dat, V1~id,value.var="V2")) 

    1 2 3 
a 1 4 2 
b 6 8 4 
c 4 5 2 

數據輸入:

dat 
    V1 V2 
1 a 1 
2 a 4 
3 a 2 
4 b 6 
5 b 8 
6 b 4 
7 c 4 
8 c 5 
9 c 2 

編輯:定時

library(microbenchmark) 
microbenchmark(
    acastmethod=acast(dat, a~id,value.var="b"), 
    dcastmethod=dcast(dat, a ~ id , value.var = "b"), 
    tidyrmethod=spread(dat, key = id, value = b), 
    xtabmethod=xtabs(b ~ a + id, data = dat) 

) 


Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval cld 
acastmethod 1.872223 2.035528 2.237846 2.210701 2.349068 3.783507 100 a 
dcastmethod 3.124578 3.405817 3.626199 3.579038 3.815807 4.887430 100 b 
tidyrmethod 4.025684 4.477290 4.765803 4.725326 5.035862 6.140385 100 c 
    xtabmethod 5.054490 5.529382 6.378615 5.714020 6.047391 61.242200 100 d 
+0

acast中的公式前後的變量是什麼? – PraneethVepakomma

+0

@我提供我的樣本數據爲'dat' – Wen

+0

好的。爲什麼不使用dcast而不是acast?這種方式不需要使用as.data.frame。是快速或更快? – PraneethVepakomma