2012-02-15 158 views
1

我想先將矢量轉換爲轉換矩陣(我管理的)。作爲第二步,我想將結果函數應用於不同的受訪者完成不同任務的數據集。 因此,我希望得到一個嵌套在答覆者和任務中的列表。將轉換矩陣轉換爲列表列表

下面是一個例子的數據幀:

Data <- data.frame(
    respondent = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2), 
    task = c(1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2), 
    acquisition = sample(1:5, replace = TRUE) 
    ) 

和這裏我的結果向量和函數,它獲取矢量和生成轉換矩陣:

result <- matrix(data = 0, nrow = 5, ncol = 5) 

gettrans <- function(invec){ 
      for (i in 1:length(invec)-1){ 
      result[invec[i],invec[i+1]] <- result[invec[i], invec[i+1]] + 1 
      } 
      return(result) 
      } 

現在,我得到一個扁平的結果與

with(Data,aggregate(acquisition,by=list(respondent=respondent,task=task),gettrans)) 

然而,我想看起來像這樣:

$respondent 
[1]$task[1] 
result 

$respondent 
[1]$task[2] 
result 

... 

我dlply發揮各地,但不能得到那個工作... 任何建議表示讚賞!

+0

出於興趣,您爲什麼需要列表清單?在大多數情況下,單個列表將更容易與事後協同工作。 – 2012-02-15 09:50:02

+0

我錯過了dlply中的總結聲明......謝謝!我沒有看到如何總結ans_as_list中的任務或選擇特定的受訪者(假設有更多)。所以我想列表清單會做的伎倆... – schultem 2012-02-15 10:48:56

回答

2

dlply自然給你一個清單(而不是清單)。稱它的標準的方式是

(ans_as_list <- dlply(
    Data, 
    .(respondent, task), 
    summarise, 
    res = gettrans(acquisition) 
)) 

這應該是適合大多數的目的,但如果你真的必須有一個列表的列表,使用llply(或相當於lapply)進行重組。

(ans_as_list_of_lists <- llply(levels(factor(Data$respondent)), function(lvl) 
{ 
    ans_as_list[grepl(paste("^", lvl, sep = ""), names(ans_as_list))] 
})) 
+0

如果答案是有用的,你可以通過點擊左側的向上箭頭upvote。 (您可以做到這一點,並將答案標記爲正確。) – 2012-02-15 11:07:52