显示列表中的相邻成员

msn*_*msn 4 indexing r stringr

我想根据匹配检查列表中的相邻元素。例如,在随机排序的字母列表中,我想知道 的相邻字母是什么m。我当前的解决方案是:

library(stringr)
ltrs <- sample(letters)
ltrs[(str_which(ltrs,'m')-2):(str_which(ltrs,'m')+2)]
[1] "j" "f" "m" "q" "a"
Run Code Online (Sandbox Code Playgroud)

对我来说,重复str_which()感觉没有必要。有没有更简单的方法来达到相同的结果?

r2e*_*ans 5

首先,我使用种子重新生成随机数据以实现可重复性:

set.seed(42)
ltrs <- sample(letters)
ltrs
#  [1] "q" "e" "a" "j" "d" "r" "z" "o" "g" "v" "i" "y" "n" "t" "w" "b" "c" "p" "x"
# [20] "l" "m" "s" "u" "h" "f" "k"
Run Code Online (Sandbox Code Playgroud)

使用-2:2然后(小心地)删除那些低于 1 或高于向量长度的值:

ind <- -2:2 + which(ltrs == "m")
ind <- ind[0 < ind & ind < length(ltrs)]
ltrs[ind]
# [1] "x" "l" "m" "s" "u"
Run Code Online (Sandbox Code Playgroud)

如果您的目标不止一个(不仅仅是"m"),那么我们可以使用不同的方法。

ind <- which(ltrs %in% c("m", "f"))
ind <- lapply(ind, function(z) { z <- z + -2:2; z[0 < z & z <= length(ltrs)]; })
ind
# [[1]]
# [1] 19 20 21 22 23
# [[2]]
# [1] 23 24 25 26
lapply(ind, function(z) ltrs[z])
# [[1]]
# [1] "x" "l" "m" "s" "u"
# [[2]]
# [1] "u" "h" "f" "k"
Run Code Online (Sandbox Code Playgroud)

或者,如果您不介意将它们分组,我们可以尝试以下操作:

ind <- which(ltrs %in% c("m", "f"))
ind <- unique(sort(outer(-2:2, ind, `+`)))
ind <- ind[0 < ind & ind <= length(ltrs)]
ltrs[ind]
# [1] "x" "l" "m" "s" "u" "h" "f" "k"
Run Code Online (Sandbox Code Playgroud)

  • 当然。如果我们尝试将 `"k"` 与 `ltrs[-2:2 + which(ltrs == "k")]` 匹配,我们将得到 `c("h", "f", "k",不适用,不适用)`。另一种防止获取“NA”的方法是将其包装在“na.omit”中。有几种方法。 (2认同)