我有一个数据框final
,其中每个观察在名为final$workerId
的列中都有一个id
如果他们的ID在另一个名为omit
的列表中找到,我想删除此数据框的某些行
这是我试过的
final <- read.csv("the data.csv")
omit <- c("A3E9N7HDRLT8KV","A39HQTITNY9TVJ","A272A0JGRTBFCR","A1QPHQ1C27ZFI7")
final <- final[,-final$workerId %in% omit]
我知道如何使用for循环来实现它,但我正在寻找一种不使用for循环的解决方案
答案 0 :(得分:2)
%in%
返回逻辑向量。可以使用!
而不是-
找到逻辑向量的反面,因此final[!final$workerId %in% omit, ]
就是您想要的。
您也可以使用which
将逻辑转换为整数索引向量,然后您可以使用-
,如下所示:final[-which(final$workerId %in% omit), ]
,但第一种方式似乎更简单。
示例:
mtcars[!mtcars$cyl %in% c(4, 6), ]
mpg cyl disp hp drat wt qsec vs am gear carb
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
答案 1 :(得分:1)
这是一个有趣的dplyr解决方案。语法的逻辑类似于您在问题中编写的基本R尝试。
omit <- c("A3E9N7HDRLT8KV","A39HQTITNY9TVJ","A272A0JGRTBFCR","A1QPHQ1C27ZFI7")
final <- filter(final, !(workerId %in% omit))
dplyr's
filter
根据某种条件选择行的子集。我们在此处提供的条件是不在向量!
的(%in%
)中的(omit
)字符串集。因为它是dplyr
函数,所以在第一个参数中调用向量final
后,在引用向量workerId
时不需要使用数据帧名称height: self.minimum_height
。