【问题标题】:Looping through sequence objects in a list?遍历列表中的序列对象?
【发布时间】:2013-04-05 16:05:05
【问题描述】:

我有一个包含 24 个TraMineR 序列对象的列表。现在我想计算每个序列对象的最佳匹配距离(仅在每个对象内)并将其存储在一个新列表中,该列表现在包含 24 个 OM 距离对象(距离矩阵)。

数据集可以在here找到。

library(TraMineR)
sequences <- read.csv(file = "event-stream-20-l-m.csv", header = TRUE, nrows=10)
repo_names = colnames(sequences)

# 1. Loop across and define the 24 sequence objects & store them in sequence_objects
colpicks <- seq(10,240,by=10)
sequence_objects <- mapply(function(start,stop) seqdef(sequences[,start:stop]), colpicks-    9, colpicks)

# 2. Calculate the costs for OM distances within each object 
costs <- mapply(seqsubm(sequence_objects, method="TRATE"))

# 3. Calculate the OM distance objects for each sequence object
sequences.om <- seqdist(sequence_objects, method="OM", indel=1, sm=costs, with.missing=FALSE, norm="maxdist")

步骤 (1) 工作正常,但是当我进入步骤 (2) 时,它告诉我:

Error in seqsubm(sequence_objects, method = "TRATE") : 
[!] data is NOT a sequence object, see seqdef function to create one

这很自然,因为sequence_objects 不是序列对象,而是序列对象的列表。

如何将seqsubm 函数应用于序列对象列表?

【问题讨论】:

  • 只是投票结束而不建议问题如何改进不是很有建设性...
  • 我怀疑这些是迁移这个问题的投票,因为它可能会在 SO 上得到更好的关注。不过,我确实有一个改进建议:请仔细阅读代码和错误消息,因为错误消息中的sequences_objects 与代码中的sequence_objects 并不完全匹配——这有点奇怪。
  • 已更正 - 现在它有正确的错误消息。
  • @histelheim,您能否发布sequences 的示例数据。谢谢
  • mapply 的语法是mapply(function, list1, list2, MoreArgs=list(...) )。在没有数据的情况下,很难猜测您可能在哪里出现更多错误,但您当前的调用肯定是错误的。

标签: r data-manipulation traminer


【解决方案1】:

我不熟悉 TraMineR 包,但是您似乎正在尝试迭代 sequence_objects 的元素。

mapply 用于同时迭代多个对象。
lapply 相反用于迭代单个对象。

因此,以下可能对您有用:

 costs <- lapply(sequence_objects, seqsubm, method="TRATE")

【讨论】:

  • 这会返回Error in FUN(X[[1L]], ...) : [!] data is NOT a sequence object, see seqdef function to create one,这很奇怪,因为在第 1 步中,seqdef 函数在我看来是成功的方式
  • 尝试在步骤 1 中将 SIMPLIFY=FALSE 添加到 mapply 语句中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2021-11-21
  • 1970-01-01
  • 2019-02-11
  • 2011-08-19
  • 2018-05-08
相关资源
最近更新 更多