首页 > 解决方案 > R中跨多个列的简洁子集

问题描述

假设我有一个庞大的数据框,并且在多个列中,我有一个非常大的唯一代码列表,我想使用这些代码来选择某些行来子集原始数据框。大约有 1000 个代码,我希望所有代码都遵循。例如,我有大约 30 列包含代码,我只想在这些列中的任何一个中获取代码为 100 到 120 的行。

要做到这一点还有很长的路要走,就像

new_dat <- df[which(df$codes==100 | df$codes==101 | df$codes1==100 

我对每个可能包含这些代码的列的每个可能的代码重复此操作。有没有办法以更方便的方式做到这一点?

我想尝试用dplyr'sselect函数解决这个问题,但我无法确定它是否适用于我的情况

获取iris数据集

假设我想要在列名中包含单词 Sepal 的任何列中包含值 4.0-5.0 的所有行。

#this only goes for 4.0

brand_new_df <- select(filter(iris, Sepal.Length ==4.0 | Sepal.Width == 4.0))

但我想要的是

brand_new_df <- select(filter(iris, contains(Sepal) == 4.0:5.0))

有没有 dplyr 方法可以做到这一点?

标签: rdplyr

解决方案


across()@RonakShah 回答的相应版本:

library(dplyr)

iris %>% filter(rowSums(across(contains('Sepal'), ~ between(., 4, 5))) > 0)

或者

iris %>% filter(rowSums(across(contains('Sepal'), between, 4, 5)) > 0)

来自vignette("colwise")

以前,与和助手filter()配对。现在,相当于,并且没有直接替代.all_vars()any_vars()across()all_vars()any_vars()

所以你需要类似的东西rowSums(...) > 0来实现any_vars().


推荐阅读