【问题标题】:R Removing an element of a list elementR删除列表元素的元素
【发布时间】:2015-08-03 02:28:11
【问题描述】:

这是关于R中列表行为的更一般的问题,但具体问题是:

我有一个单词组列表,我正在尝试手动删除特定单词 - 其中没有两次提及任何单词。

目前,我正在使用这种方法

l = strsplit(c("a b", "c d"), " ")

> l
[[1]]
[1] "a" "b"

[[2]]
[1] "c" "d"

# remove the value "d"
l = lapply(l, function(x) { x[x != "d"] })

> l
[[1]]
[1] "a" "b"

[[2]]
[1] "c"

有没有更适合使用的内置列表索引方法?我觉得我应该能够在不使用lapply 的情况下解析列表。如果没有,是否有人可以解释为什么会这样?

谢谢

【问题讨论】:

  • 这个问题有点不清楚。您是否愿意将第一个字符串中的 c("a", "b") 与第二个字符串中的 c("c", "d") 分开?如果没有,您可以执行 x=unlist(l),然后执行 x=x[x!="d"]。否则,您将逐个元素地进行操作,或者构建一个数据结构,在其中保存各个片段对应的字符串的信息。

标签: r list indexing


【解决方案1】:

您需要遍历列表的每个元素并检查向量是否包含d 以过滤/删除它。 原因之一是列表可以包含各种类型的数据(functionsdata.framenumericcharacterboolean、其他listsclass)所以不可能有vectorized 操作(顾名思义,用于向量)。

您所做的是在前端过滤您的过滤器 - 例如,当您拥有列表时。最好在你的向量后端过滤,例如获得list:

l = strsplit(gsub('d','',c("a b", "c d")), " ")
#[[1]]
#[1] "a" "b"

#[[2]]
#[1] "c"

前端过滤的一些替代解决方案:

lapply(l, grep, pattern='[^d]', value=T)

【讨论】:

  • 感谢您的解释。不过还有一件事——我不得不做一些强制以将数据转换为列表格式,strsplit(c("a b", "c d"), " ") 只是对一个例子感兴趣。如果我只是像上面那样有一个列表l,并且我想删除"d",那么最好的选择仍然是后端过滤/我做了什么?
  • 是的,你的方法是完全有效的!万一我添加了grep的替代方案,以便不编写函数。
猜你喜欢
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2016-05-28
  • 2017-09-03
相关资源
最近更新 更多