【问题标题】:R transition matrix into List of ListsR转换矩阵到列表列表
【发布时间】:2012-02-15 08:15:51
【问题描述】:

我想先将一个向量转换为一个转换矩阵(由我管理)。作为第二步,我想将结果函数应用于不同受访者执行不同任务的数据集。 因此,我想获得一个嵌套在 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 但无法让它工作...... 任何建议表示赞赏!

【问题讨论】:

  • 出于兴趣,为什么需要列表列表?在大多数情况下,之后使用单个列表会更容易。
  • 我错过了 dlply 中的汇总语句......谢谢!我看不到如何总结 ans_as_list 中的任务或选择特定的受访者(假设有更多)。所以我认为列表列表可以解决问题......

标签: r list plyr


【解决方案1】:

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))]
}))

【讨论】:

  • 如果答案有用,您可以点击左侧的向上箭头进行投票。 (您可以这样做,也可以将答案标记为正确。)
猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2017-12-22
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多