首页 > 解决方案 > 删除多个数据框中的行

问题描述

我有大量的 DF。我想对所有 DF 进行更改,但无法弄清楚。

我想删除 Class = Poor 的行,并保留所有其他行。

 DF1:
 Name  Class Weight Jan_income Feb_income
 John  Rich   92     10000      45454
 Sam   Poor   23     100        4552
 Laura Poor   45     123        7542


 DF2:
 Name  Class Weight Jan_income Feb_income
 Mark  Poor     23     1031       5434
 Sam   Middle   23     100        951
 Laura Poor     45     123        421

我可以为一个 DF 做到这一点

 DF1 <- DF1 [!(DF1$Class == "Poor"),]

我很高兴保留现有的 DF 名称。任何帮助表示赞赏。

标签: r

解决方案


一种选择是将其放在list. 如果名称有pattern,则使用mgetwithls

lst1 <- lapply(mget(ls(pattern = "^DF\\d+$")), subset,  Class != "Poor")

如果数据集具有相同的列名,则

out <- do.call(rbind, lst1)

或使用与 OP 相同的代码,使用匿名函数调用

lapply(mget(ls(pattern = "^DF\\d+$")), function(x) x[[!(x$Class == "Poor"),])

或者另一个选项map来自purrr

library(purrr)
library(dplyr)
out1 <- map_dfr(mget(ls(pattern = "^DF\\d+$")), ~ .x %>%
                                          filter(Class != "Poor"))

如果打算有一个单一的data.frame,最好不要在全局环境中创建多个对象,即如果我们从文件中读取数据集,list直接将其读取到a并将行子集化

library(readr)
map_dfr(files, read_csv, .id = 'grp') %>%
       filter(Class != "Poor")

或在base R

out2 <- do.call(rbind, Map(cbind, grp = seq_along(files), lapply(files, read.csv)))
subset(out2, Class != "Poor")

推荐阅读