2016-03-05 85 views
3

我有具有以下格式非數字值的數據幀:重塑一個數據幀中的R與非數值

DF1:

col1 col2 
1 a  b 
2 a  c 
3 z  y 
4 z  x 
5 a  d 
6 m  n 

我需要將其轉換成這種格式,

DF2:

col1 col2 col3 col4 
1 a  b  c  d 
2 z  y  x  NA 
3 m  n  NA  NA 

隨着COL1作爲主鍵(不知道這是R中的右術語) ,而其餘​​的列包含與該鍵相關的元素(如在DF1中所見)。

與DF1相比,DF2將包含更多列,具體取決於與任何鍵關聯的元素數量。

某些列將不具有由與每個鍵相關聯的不同數量的元素產生的值,表示爲NA(如DF2中所示)。

列名可以是任何東西。我試圖使用reshape(),melt()+ cast(),甚至是一個泛型for循環,我使用cbind並嘗試刪除該行。

它是超過5000萬行的非常大的數據集的一部分。我可能不得不爲這項任務使用雲服務,但這是一個不同的討論。

我是R的新手,所以可能會有一些明顯的解決方案,我錯過了。

任何幫助將不勝感激。

-Thanks

+0

什麼是你想怎麼第二個安排在邏輯關於第一? – alistaire

+1

'dd $ time < - ave(seq_along(dd $ col1),dd $ col1,FUN = seq_along); reshape(dd,dir ='wide',idvar ='col1',timevar ='time',v.names ='col2')' – rawr

+0

編輯以解釋更多關於2個數據幀之間的關係 –

回答

3

如果這是一個大的數據集,我們可以使用data.table

library(data.table) 
setDT(DF1)[, i1:=paste0("col", seq_len(.N)+1L), col1] 
dcast(DF1, col1~i1, value.var='col2') 
# col1 col2 col3 col4 
#1: a b c d 
#2: m n NA NA 
#3: z y x NA 
+0

謝謝@akron!解決方案有效! 因爲我目前正在測試我的代碼在一個小的數據集(〜1k行),我想知道爲什麼這個解決方案比@rawr給出的更大的數據集(~50m行)更好。 我應該爲兩種解決方案運行我的整個數據集還是在這裏有一個乾淨的贏家。 再次抱歉,我是R –

+0

@ UT-的新手。與'reshape2'中的'dcast'或'base R'重塑函數相比,'data.table'中的'dcast'速度非常快。另外,請在'〜50m'數據集上運行後,考慮接受最有效的解決方案(通過單擊表決旁邊的勾號)。 – akrun

2

使用dplyrtidyr

library(tidyr) 
library(dplyr) 

DF <- data_frame(col1 = c("a", "a", "z", "z", "a", "m"), 
       col2 = c("b", "c", "y", "x", "d", "n")) 
# you need to another column as key value for spreading 
DF %>% 
    group_by(col1) %>% 
    mutate(colname = paste0("col", 1:n() + 1)) %>% 
    spread(colname, col2) 
#> Source: local data frame [3 x 4] 
#> Groups: col1 [3] 
#> 
#> col1 col2 col3 col4 
#> (chr) (chr) (chr) (chr) 
#> 1  a  b  c  d 
#> 2  m  n NA NA 
#> 3  z  y  x NA 
+0

謝謝! 該解決方案有效地工作! 但是,鏈接[鏈接](http://stackoverflow.com/questions/21435339/data-table-vs-dplyr-can-one-do-something-well-the-other-cant-or-does-poorly )聲明數據。當涉及非常大的數據集時,表格比dplyr要快,我需要處理這些數據集。因此,當我在大數據集上運行時,我會嘗試使用@akrun提供的解決方案。不過,非常感謝解決方案! –

+0

是的data.table被認爲是在非常大的數據集上執行的,其中一個原因是因爲通過引用來工作。但是,即使dplyr不是通過引用工作,dplyr也可以在大數據集上運行。只是爲了你知道。 – cderv