如果在R中的另一个列表中找到id,则删除数据帧的行

时间:2017-03-19 01:55:41

标签: r

我有一个数据框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循环的解决方案

2 个答案:

答案 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