使用动态变量对R进行子集

时间:2016-07-12 17:45:30

标签: r dataframe subset

我有以下示例代码。我有一个有16行的数据帧ts。当我用实际数字进行子集时,它工作正常但是当我用计算数字进行子集时,为什么我的代码表现得很奇怪?

有人可以解释一下我的错误吗?

情况1:

> a
[1] 12
> c
[1] 16

> ts$trend[13:16]
[1] 21.36926 21.48654 21.60383 21.72111

> ts$trend[a+1:c]
 [1] 21.36926 21.48654 21.60383 21.72111       NA       NA       NA       NA       NA       NA       NA       NA
[13]       NA       NA       NA       NA

案例2:

> b
[1] 4
> temp[1: 8]
[1] 1 2 3 4 5 6 7 8
> temp[1: b+b]
[1] 5 6 7 8

2 个答案:

答案 0 :(得分:5)

R并不关心你的空间表达方式。根据严格的优先方案评估事物。括号中的内容首先完成。所以:

> 1: b+b
[1] 5 6 7 8

因为加法的优先级低于":"。首先评估1:b,然后添加b。所以你得到:

> (1:b)+b
[1] 5 6 7 8

如果您想要替代方案,请将事物括起来:

> 1:(b+b)
[1] 1 2 3 4 5 6 7 8

我建议您将(1+b):b加上括号,如果这是您想要的 - 括号没有区别,但它们有助于忘记优先规则的任何人的可读性。

答案 1 :(得分:2)

这是运营商优先的情况。使用括号

可以避免这种情况
temp[1:(b+b)]
#[1] 1 2 3 4 5 6 7 8

如果我们检查OP代码中的问题

1:b
#[1] 1 2 3 4

(1:b) + b
#[1] 5 6 7 8

因此,运算符优先级通过评估1:b然后添加b。

来实现

这在?Syntax

中有详细描述
  

:: :::访问命名空间中的变量   $ @ component / slot   提取[[[索引   ^指数(从右到左)    - +一元减号和加号   :序列运算符%任何%特殊运算符(包括%%和%/%)   * /乘,除   + - (二进制)加,减    < > < => = ==!=订购和比较    !否定    &安培; &安培;&安培;和    | ||要么    〜就像公式一样    - > - >>向右分配    < - << - 赋值(从右到左)   =任务(从右到左)
  ?帮助(一元和二元)

数据

temp <- 1:10
b <- 4