【问题标题】:Pick the lengthier and give the index of the shorter in an R vector选择较长的并给出 R 向量中较短的索引
【发布时间】:2020-02-22 01:12:33
【问题描述】:

setdiff() 要求其第一个向量参数比其第二个向量参数更长。为了克服这个限制,我总是尝试将两个参数中较长的放在第一位,较短的放在第二位。

which.max() 给出了较长参数的索引 (ind),但我想知道如何在不使用 which.min() 的情况下获得较短参数的 ind

这是我正在做的事情:

a = c("bob", "jim", "jon")
b = c("bob", "jim", "jon", "al")

NAMES <- list(a, b)

ind <- which.max(sapply(NAMES, length)) # index for lengthier of `a` and `b` 

setdiff(NAMES[[ind]], NAMES[[???]])#But what to put for ind of shorter arg: NAMES[[!ind]] fails

【问题讨论】:

  • 如果长度相同怎么办?即NAMES = list(a = c('a', 'b', 'c'), b = c('b', 'c', 'd'))
  • which.max 返回第一个最大元素的索引。因此,在我展示的示例中,它将是 NAMES[['a']]
  • 我的问题是在这种情况下你想得到什么作为输出。如果您需要 'a' 作为输出,它会使用当前代码提供该输出
  • “setdiff() 要求它的第一个向量参数比它的第二个向量参数长”:这是错误的。你为什么这么认为?
  • @Reza 在这种情况下,创建一个条件l1 &lt;- lengths(NAMES); ind &lt;- if(length(unique(i1))==1) 0 else which.max(l1)

标签: r function vector


【解决方案1】:

我们可以使用[ 代替[[(一般情况下)

ind <- which.max(lengths(NAMES)) # lengths would be more efficient

使用listlength 仅为2 的示例,使用-

setdiff(NAMES[[ind]], NAMES[[-ind]])
#[1] "al"

如果list的长度大于2,则循环使用NAMES[-ind]sapply

lapply(NAMES[-ind], setdiff, x = NAMES[[ind]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多