R转换矩阵到列表列表

时间:2012-02-15 08:15:51

标签: r list plyr

我想首先将矢量转换为转换矩阵(我管理过)。作为第二步,我想将结果函数应用于数据集,其中不同的受访者执行不同的任务。 因此,我想获得一个嵌套在Respondent和Task上的List。

以下是一个示例数据框:

  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一起玩了但是无法让它工作...... 任何建议赞赏!

1 个答案:

答案 0 :(得分: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))]
}))