2012-02-15 161 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