r - 使用 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_down、C_down、D_down,因为它们以_down结尾。如何在 R 中动态选择这些列,而无需对其进行硬编码。
我在 [post here] 中看到(使用 dplyr 在许多列上过滤多个条件),可以使用select(df, ends_with("_down")),但这只会给我一个部分数据框。我希望像上面那样维护整个数据框结构。
谢谢您的帮助。
解决方案
我们可以使用type.convert
withis.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