2016-08-21 39 views
1

我有一個列表:如何使無維度名稱矩陣從列表

direc <- structure(list(no_trades = 3L, sell_trades = 19L, buy_trades = 18L), .Names = c("no_trades", "sell_trades", "buy_trades")) 
# $no_trades 
# [1] 3 
# 
# $sell_trades 
# [1] 19 
# 
# $buy_trades 
# [1] 18 

我要讓不從這個名單維度名稱的矩陣。這將是類似這樣的矩陣結構:

classified <- structure(c(9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13), .Dim = c(3L, 15L)) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] 
# [1,] 9 9 9 9 9 9 9 9 9  9  9  9  9  9  9 
# [2,] 6 6 6 6 6 6 6 6 6  6  6  6  6  6  6 
# [3,] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 

我試圖從另一個SO question下面的代碼意味着數據幀,以矩陣的變換:

m2 <- `dimnames<-`(as.matrix(direc), NULL) 

但它再次給了我一個清單:

結構(列表(3L,19L,18L),.dim僞= C(3L,1L))

在此先感謝您的答案。

+1

也許你需要''dimnames < - 「(do.call(cbind,direc),NULL)' – akrun

+0

@nrussell不,請參閱代碼。它不適用於列表。這個問題是由我在數據框方面提出的,以減少矩陣轉換。 –

+1

@PolarBear在你以前的案例中,它是一個data.frame,現在它是一個'list',並且可以通過'list'的元素'cbind'完成到'matrix'的轉換,然後執行'dimnames'空值。如果'list'元素的長度不同,則在執行'cbind'之前,您需要填充NA來調整長度。 – akrun

回答

1

這裏的「直銷」是一個list和轉換到matrixas.matrix不會直接發生,但我們可以把它與rbind/cbind改爲matrix。初始direc元素都是integer類。如果我們需要有numeric類,它需要轉換

m1 <- `dimnames<-`(do.call(cbind, lapply(direc, as.numeric)), NULL) 
dput(m1) 
#structure(c(3, 19, 18), .Dim = c(1L, 3L)) 

如果list元素具有不同的長度,它可以做cbind

`dimnames<-`(do.call(cbind, lapply(direc, `length<-`, max(lengths(direc)))), NULL) 

之前更好地墊NA要了解爲什麼as.matrix在此處不起作用,我們可以檢查methodslist

methods(class = "list") 
#[1] all.equal  as.data.frame as.data.table as_data_frame 
#[5] coerce  escape  melt   Ops   relist  
#[10] sotrunc  within  

它沒有as.matrix選項。

+1

如果你還認爲這個問題不重複,那麼請做好必要的工作。 –

+0

@PolarBear它不是封閉的,但我認爲它與你之前的帖子有關,儘管它不是一個確切的愚蠢。 – akrun

+0

請看這個需要回答的相關問題。 http://stackoverflow.com/questions/39180720/running-functions-that-require-specific-object-class-inside-for-loop謝謝你 –