首页 > 解决方案 > 使用 ends_with 在 R 中动态选择列

问题描述

我有一个数据框,我想通过选择所有实例 TRUE 出现在数据框中来减小它的大小。

这是数据框:

df<-structure(c("1", "2", "3", "4", "5", "TRUE", "FALSE", "TRUE", 
"TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "TRUE", "FALSE", 
"TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "a", "b", "c", "d", 
"e"), .Dim = c(5L, 5L), .Dimnames = list(NULL, c("A", "B_down", 
"C_down", "D_down", "E")))

为了将数据框减少到 TRUE 所在的位置,我使用了以下代码:

df[which(apply(df[,c(2:4)],1,function(x) any(x)=="TRUE")),]

但是,我手动选择了列 c(2:4) - B_downC_downD_down,因为它们以_down结尾。如何在 R 中动态选择这些列,而无需对其进行硬编码。

我在 [post here] 中看到(使用 dplyr 在许多列上过滤多个条件),可以使用select(df, ends_with("_down")),但这只会给我一个部分数据框。我希望像上面那样维护整个数据框结构。

谢谢您的帮助。

标签: rdplyr

解决方案


我们可以使用type.convertwithis.logical动态检查列类型

i1 <- sapply(as.data.frame(df, stringsAsFactors = FALSE), 
           function(x) is.logical(type.convert(x)))

如果仅针对列名中具有“向下”的列,则具有另一个逻辑向量grepl

i2 <- grepl("_down$", colnames(df))
i1 & i2
#     A B_down C_down D_down      E 
# FALSE   TRUE   TRUE   TRUE  FALSE 

推荐阅读