如何根据另一个表的值删除一个表中的行

时间:2018-04-28 11:48:11

标签: r row data-cleaning

我有问题。我有两张不同的桌子。一个包含用户信息及其ID号和另一个也有ID号的表,第二列表示用户是否是管理员。

表1

UserID AssigID Score      Date       Time

14532   23956   52      11.11.2017    401
12254   23956   22      18.11.2017    256
12644   23956   74      17.12.2012    365
11257   23957   45      10.10.2012    102
12667   23958   25      10.11.2012    109

表2

UserID  Admin

14532   TRUE
12254   FALSE
12644   FALSE
11257   FALSE
12667   FALSE

如表2所示,userID 14532是一个管理员,我想从table1中删除该用户的数据。 如何在表1中删除用户为Admin的行,基于表2中的数据?

作为

1 个答案:

答案 0 :(得分:2)

基础R的可能方法:

tab1[tab1$UserID %in% tab2$UserID[!tab2$Admin],]

给出:

  UserID AssigID Score           TimeStamp TimeOnTask
2  12254   23956    22 2017-11-18 13:16:00        256
3  12644   23956    74 2012-12-17 13:18:00        365
4  11257   23957    45 2012-10-10 13:29:00        102
5  12667   23958    25 2012-11-10 13:40:00        109

这是做什么的:

  • tab2$UserID[!tab2$Admin]提供了一个非管理员用户ID的向量。 !tab2$Admin部分确保仅选择不是管理员的ID。
  • 使用tab1$UserID %in% ...,您只选择tab1中来自第一步的向量中的用户ID。这将返回一个逻辑向量,随后您可以使用该向量进行子集tab1

使用过的数据:

tab1 <- structure(list(UserID = c(14532L, 12254L, 12644L, 11257L, 12667L),
                       AssigID = c(23956L, 23956L, 23956L, 23957L, 23958L),
                       Score = c(52L, 22L, 74L, 45L, 25L),
                       TimeStamp = structure(c(1510402260, 1511007360, 1355746680, 1349868540, 1352551200), class = c("POSIXct", "POSIXt"), tzone = ""),
                       TimeOnTask = c(401L, 256L, 365L, 102L, 109L)),
                  .Names = c("UserID", "AssigID", "Score", "TimeStamp", "TimeOnTask"), row.names = c(NA, -5L), class = "data.frame")
tab2 <- structure(list(UserID = c(14532L, 12254L, 12644L, 11257L, 12667L),
                       Admin = c(TRUE, FALSE, FALSE, FALSE, FALSE)),
                  .Names = c("UserID", "Admin"), class = "data.frame", row.names = c(NA, -5L))