我有一个如下所示的字符向量列表:
[[1]]
[1] "medical" "center" "name
[7] "laboratory" "medicine" "william"
[13] "laboratories" "2431" "highway"
...
[680]
...
[[100]]
..
[590]
列表中的每个成员代表一名患者,每个成员的角色向量是他们的标记化医疗报告。我正在挖掘列表中每个成员的某些参数,并使用以下代码:
f <- function(x, phrase, n_words = 3L, upto = NULL) {
x <- paste0(x, collapse = ' ')
word <- '\\b\\w+\\b\\s*'
p <- if (!is.null(upto))
sprintf('(?:%s)\\s*((%s)+)%s|.', phrase, word, upto)
else sprintf('(?:%s)\\s*((%s){1,%s})|.', phrase, word, n_words)
trimws(gsub(p, '\\1', x))
}
在单字符矢量对象上使用时,此功能运行良好。例如:
>f(P1, "histology results", upto = "diagnosed by"))
[1] highly differentiated, stage 4 out of 4
其中P1是标记化单词的字符对象。
但是,使用列表并使用lapply函数,我收到错误。
> lapply(list, f, list[[i]], "histology results", upto = "diagnosed by")
Error in list[[i]] :
attempt to select less than one element in get1index
当我运行该函数选择列表中的各个成员时,它适用于每个成员,没有抛出任何错误。就像一个例子:
> f(list[[2]], "histology results", upto = "diagnosed by")
[1] "mildly differentiated stage 1 of 4"
我做错了什么?
答案 0 :(得分:0)
注意i
代替个案中列表的索引,例如, i=2
:f(list[[2]], "histology results", upto = "diagnosed by")
在lapply
函数中,您实际上调用的内容类似于list[[list]]
而不是list[[1]], list[[2]], ..., list[[length(list)]]
。因此,您希望lapply
迭代的对象是索引列表1:length(list)
。尝试:
lapply(1:length(list), function(i) f(list[[i]], "histology results", upto = "diagnosed by"))
或者将list
对象提供给lapply
并直接在其上调用f
函数,而不需要子集。尝试:
lapply(list, function(i) f(i, "histology results", upto = "diagnosed by"))