如何根据两列中的值删除行

问题描述 投票:0回答:1

我有一个包含 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"))

这可行,但在美学上不令人愉悦。谁能帮我让它变得更简单、更漂亮吗?

r dplyr
1个回答
0
投票

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"))
© www.soinside.com 2019 - 2024. All rights reserved.