【问题标题】:Check if elements in a vector are drawn exclusively from another vector检查向量中的元素是否仅来自另一个向量
【发布时间】:2014-02-05 17:44:39
【问题描述】:

我有一个 R 列表,其中包含不同长度的数字向量。像这样。

l = list(a = c(0, 1, 2), b = c(0, 1), c = c(0, 1, NA), d = c(0, 1, 5))

我想识别具有01NA 值的向量,因此可以转换为逻辑向量。在上面的示例中,我将识别向量 bc

为此,我将尝试这样的事情。

is.logical.vector = lapply(l, FUNCTION_NAME)

但我不确定用什么函数代替FUNCTION_NAME(这只是一个占位符,用于说明目的)。我需要可以采用像allowed = c(0, 1, NA) 这样的向量并确保只有allowed 中的值在向量的元素中表示的东西(如列表l 中的那些)。

你知道这样的功能是否存在吗?或者,您知道我如何在没有显式 for 循环的情况下构造这样的函数吗?提前谢谢!

【问题讨论】:

  • @AnandaMahto,这是真的(不是双关语)。但我想识别值为 0、1 或 NA 的向量,以转换为逻辑向量。我对其他值的向量不感兴趣。
  • 类似vapply(l, function(z) all(z %in% c(0, 1, NA)), logical(1L))? (或lapply(l, function(z) all(z %in% c(0, 1, NA)))。)根据您的评论,您还应该从结果中排除“a”。
  • @AnandaMahto,你成功了!您介意将您的答案作为正式答案而不是评论,以便我可以接受吗?顺便说一句,我发现 T 而不是 logical(1L) 可以节省字符数,但效果也一样。
  • "我会识别向量 a、b 和 c。" c 中有一个 2,您要允许它还是只包含 只有 0、​​1 或 NA 的向量?
  • @user3114046,好收获!已适当编辑问题。

标签: r list vector iteration


【解决方案1】:

听上去,您正在寻找all%in% 的组合:

vapply(l, function(z) all(z %in% c(0, 1, NA)), logical(1L))
#     a     b     c     d 
# FALSE  TRUE  TRUE FALSE 

或者,您可以使用lapply

lapply(l, function(z) all(z %in% c(0, 1, NA)))

仅供参考,as.logical(5) 甚至 as.logical(-5) 也评估为 TRUE,因此您的条件“因此,可以转换为逻辑向量”与您实际看起来的情况完全不匹配要求:-)

【讨论】:

  • 另一条路:mapply(identical, l, lapply(lapply(l, as.logical), as.numeric))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多