使用mtcars数据框:
head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
在学习子集(现在我知道如何通过正确使用索引或subset
来做到这一点)时,我正在尝试并使用了代码
head(mtcars[,-mtcars$drat])
mpg drat wt qsec vs am gear carb
Mazda RX4 21.0 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 2.76 3.460 20.22 1 0 3 1
此输出背后的逻辑是什么?
答案 0 :(得分:2)
它将数字转换为integer
并将其用作索引以删除列
as.integer(mtcars$drat)
#[1] 3 3 3 3 3 2 3 3 3 3 3 3 3 3 2 3 3 4 4 4 3 2 3 3 3 4 4 3 4 3 3 4
integer
中提到了对?Extract
的胁迫
i,j-指定要提取或替换的元素的索引。索引是数字或字符向量,或者为空(丢失)或NULL。数字值被as.integer强制转换为整数(因此被截断为零)。
即通过删除从'drat'列获得的唯一列索引
setdiff(seq_along(mtcars), as.integer(mtcars$drat))
#[1] 1 5 6 7 8 9 10 11
head(mtcars[setdiff(seq_along(mtcars), as.integer(mtcars$drat))])
# mpg drat wt qsec vs am gear carb
#Mazda RX4 21.0 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 3.90 2.875 17.02 0 1 4 4
#Datsun 710 22.8 3.85 2.320 18.61 1 1 4 1
#Hornet 4 Drive 21.4 3.08 3.215 19.44 1 0 3 1
#Hornet Sportabout 18.7 3.15 3.440 17.02 0 0 3 2
#Valiant 18.1 2.76 3.460 20.22 1 0 3 1
但是,如果我们删除-
,即根据索引选择列,则它将重复这些列,因为有些索引(重复的整数被重复)
head(mtcars[as.integer(mtcars$drat)])