【问题标题】:lapply not iterating through list in Rlapply 不遍历 R 中的列表
【发布时间】:2017-10-13 19:58:09
【问题描述】:

我有一个字符串列表,其中一些字符串中有重复。例如:

   [[1]]
   [1] "gr gal gr gal"

   [[2]]
   [1] "gr gal"

   [[3]]
   [1] "gr gal ir ol"

   [[4]]
   [1] "gr gal gr gal"

   [[5]]
   [1] "gr gal"

我想要的输出是:

   [[1]]
   [1] "gr gal"

   [[2]]
   [1] "gr gal"

   [[3]]
   [1] "gr gal ir ol"

   [[4]]
   [1] "gr gal"

   [[5]]
   [1] "gr gal"

从字符串中删除重复的位置。

我的计划是调用 strsplit(x, split = " ") 然后调用 split 对象上的 unique 函数。如果我选择列表中的 1 个成员,我的代码可以正常工作:

  > strsplit(pathmd1[[76]], split = " ")
  [[1]]
  [1] "gr" "gal" "gr" "gal"

  > splittest <- strsplit(pathmd1[[76]], split = " ")
  > unique(unlist(splittest))
  [1] "gr" "gal"

但是,当我使用这些函数使用 lapply 时,会引发错误

    pathmd2 <- lapply(1:length(pathmd1), function(i) strsplit(pathmd1[[i]], 
               split = " "))
    pathmd <- lapply(1:length(pathmd2), function(i) unique(pathmd2[[i]])

    unexpected symbol
    77: pathmd2 <- lapply(1:length(pathmd1), function(i) 
        strsplit(pathmd1[[i]], split = " ")
    78: pathmd
        ^

为什么函数不能与 lapply 一起使用?

【问题讨论】:

  • 我认为您收到了显示的错误,因为您在该示例中的 strsplit 调用末尾忘记了“)”
  • 缺少的尾随括号位于 pathmd &lt;- ... 命令的末尾,而不是 strsplit 命令的末尾。
  • strsplit 给出一个列表输出,即使传递一个字符串。考虑将您的列表重新转换为字符向量。 strsplit 的输出将采用预期的格式。然后调用很简单:lapply(strsplit(charVec, ' '), unique).
  • 谢谢大家。所有这些技巧都有帮助!

标签: r lapply strsplit


【解决方案1】:

你可以试试:

lapply(f, function(x) unique(unlist(strsplit(x, " "))))
#output
[[1]]
[1] "gr"  "gal"

[[2]]
[1] "gr"  "gal"

[[3]]
[1] "gr"  "gal" "ir"  "ol" 

[[4]]
[1] "gr"  "gal"

[[5]]
[1] "gr"  "gal"

其中 f 是您的列表。

不需要像 for 循环那样进行迭代

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 2021-10-18
    • 2012-10-16
    • 2016-09-19
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2020-05-26
    相关资源
    最近更新 更多