【问题标题】:What is the behavior of the ampersand operator in R's sum(...) functionR 的 sum(...) 函数中的 & 运算符的行为是什么
【发布时间】:2016-09-22 12:27:26
【问题描述】:

下面是我正在从 R 翻译成 Python 的脚本中的一行。我在 Python 方面的经验比在 R 方面更有经验,我在这里遇到了一些麻烦:

val = sum(l & f==v)

l 为真/假值向量。让f 是一个平凡值的向量,而vf 的一些可能值来测试。我希望lf 的长度相同。 f==v 部分也将产生一个布尔数组。现在我的问题是&/ampersand(逻辑与,根据R documentation)在这种情况下会做什么。 sum() 函数是否会返回一个布尔数组的总和,该数组指示 lf==v 布尔数组在哪里都为真?或者它会将两个数组的所有真实值相加并将它们相加吗?

提前谢谢你!

【问题讨论】:

  • 对逻辑值求和,TRUE 为 1,FALSE 为 0(因此对条件 cond1&cond2 的结果求和,l & f=v 是与 lf==v 长度相同的逻辑值向量,即sum 输出告诉您l & f==v 中有多少 TRUE)
  • 例如,对于l = [True, True, False]f == v --> [True, False, True],会产生2 + 2 = 4 的结果吗?
  • 不,你会得到 1:l & f==v 会是 c(TRUE, FALSE, FALSE)(看看你得到什么的最好方法是尝试一下......)
  • 非常有帮助!谢谢!

标签: r


【解决方案1】:

让我们定义几个向量:

l <- c(TRUE, FALSE, TRUE, FALSE, TRUE)
v <- 1:5
f <- rep(c(1, 4), c(3, 2))

现在让我们看看当我们分解你的行时我们有什么sum(l &amp; f==v):
在这一行中,== 优先于 &amp;

fev <- f==v
fev
[1]  TRUE FALSE FALSE  TRUE FALSE

然后我们做l &amp; fev:

lafev <- l & fev
[1]  TRUE FALSE FALSE FALSE FALSE

最后,我们总结一下:

sum(lafev)
[1] 1

通过将logical 值转换为数字,总和告诉我们lf==v 中有多少同时TRUETRUE 变为1FALSE 变为0。所以,在这个例子中,1.

【讨论】:

  • 感谢您提供的详细示例。这是对您对我最初问题的评论的很好且有用的澄清。
【解决方案2】:

这是一个示例 python 版本:

l = [True, True, False]
f = [True, False, True]
v = [True, True, True]
f_eq_v = [f[i] == v[i] for i in range(len(f))] # f == v in R
val = sum([l[i] & f_eq_v[i] for i in range(len(l))]) # val = sum(l & f==v) in R

【讨论】:

  • 你把最后两行分开有什么原因吗?
  • 只是为了在R和python中演示==和&,例如在python中f == v不能像在R中那样写,它意味着完全不同的东西(这不是元素比较)。
  • OP 要求的是 R 答案,而不是 python
  • 嗯。 @sandipan 的回答真的不值得投反对票。当 OP 询问 R 代码在做什么时,这个答案确实显示了 R 代码在做什么,但完全是 Python 翻译。 IMO 删除标志和否决票都是没有根据的。
  • 当答案以 here is a python version 开头的问题标记为 R 时,它只是不回答问题,即“它在 R 中是什么意思? ”。也许围绕“原始代码”的解释会显示答案的潜在有用性,感谢@hrbrmstr 评论
猜你喜欢
  • 1970-01-01
  • 2020-06-17
  • 2021-10-28
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2011-04-18
相关资源
最近更新 更多