首页 > 解决方案 > 如何根据另一个表的值删除一个表中的行

问题描述

我有个问题。我有两张不同的桌子。一个包含用户信息及其 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 中用户 ID 14532 是管理员,我想从表 1 中删除该用户的数据。如何根据表 2 中的数据删除表 1 中用户为 Admin 的行?

作为

标签: rrowdata-cleaning

解决方案


基于 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% ...的用户 ID 。tab1这将返回一个逻辑向量,您随后将使用该逻辑向量进行子集化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))

推荐阅读