R 使用 colname 和逻辑运算符进行子集化

R subsetting with colname and logical operator

谁能解释一下为什么在第三个示例中 R 中的子集化与第一个和第二个示例中的结果不同?我认为前 3 个子集案例是相等的。 我可以子集 mtcars["cyl">=6] 但为什么我不能子集 mtcars["cyl"==6]?

非常感谢!

data("mtcars")

mtcars[mtcars[,2]==6,]
#>                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
mtcars[mtcars$cyl==6,]
#>                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
mtcars["cyl"==6,]
#>  [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
#> <0 rows> (or 0-length row.names)

# but 
mtcars["cyl">=6,]
#>                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
....

reprex package (v0.3.0)

于 2020-07-31 创建

在第三种情况下,您将获得零行,因为您正在将字符串 "cyl"(不是变量 cyl)与数字 6 进行比较。由于您将字符串与数字进行比较,因此 R 强制将两种类型相等(如果可能):在这种情况下,R 将数字 6 转换为字符串 "6".

您现在要满足的条件是"cyl" == "6",它始终为假;因此你得到零行。


关于第四种情况,可以看出

> "cyl" >= 6
[1] TRUE

这是真的,因为两个对象不是同一类型("cyl" 是字符,6 是数字),R 将数字强制转换为字符 "6" .

现在,条件 "cyl" >= "6" 为真,因为从字母数字角度来说,"6" 等数字位于字母之前。