我有一个包含 35 列和大约 250,000 行的数据框。根据
year
列和 network_id
列中的值,我想删除一些行。此列表中给出了要删除的规范:
remove.nets <- list(r19=c(14, 31),
r21=c(31),
r23=c(32),
r24=c(1, 4, 8, 24, 30, 59))
因此,如果年份是 2019 年并且网络 ID 是 14 或 31,请删除该行,对于其他行也是如此。我尝试过这样的事情:
test.data2 <- test.data %>%
{if (year==2019) filter(., !network_id %in% remove.nets$r19)}
在我看来,这是一个显而易见的方法,但它不起作用。 (它抛出了我不明白的错误)。
Error in year == 2019 :
comparison (==) is possible only for atomic and list types
我必须从
remove.nets
列表中创建一个数据框,然后像这样做一个 anti_join
:
remove.nets <- data.frame(year=c(2019, 2019, 2021, 2023, rep(2024, 6)),
network_id=c(14, 31, 31, 32, 1, 4, 8, 24, 30, 59))
anti_join(., remove.nets, by=c("year", "network_id"))
这可行,但在美学上不令人愉悦。谁能帮我让它变得更简单、更漂亮吗?
anti_join
在美学上没有任何令人不快的地方。要从列表中获取数据框,只需执行以下操作:
names(remove.nets) <- sub('r', 20, names(remove.nets))
remove.nets.df <- data.frame(year=rep(names(remove.nets),
sapply(remove.nets, length)),
network_id=unlist(remove.nets))
然后:
library(dplyr)
anti_join(test.data, remove.nets.df, by=c("year", "network_id"))