使用ends_with在R中动态选择列

时间:2018-10-17 15:19:23

标签: r dplyr

我有一个数据框,我想通过选择所有实例来减小其大小,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](filtering with multiple conditions on many columns using dplyr)中看到,可以使用 select(df,ends_with(“ _ down”)),但这仅提供了部分数据帧。我希望像上面那样维护整个数据框结构。

谢谢您的帮助。

2 个答案:

答案 0 :(得分:3)

我们可以将type.convertis.logical一起使用以动态检查列类型

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

如果仅针对那些在列名中具有“ down”的列,则使用另一个逻辑向量,grepl

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

答案 1 :(得分:2)

有更好的方法来处理数据,但继续执行示例中的工作流程将是可行的。

df[apply(df[, endsWith(colnames(df), "_down")], 1, function(x) any(x == "TRUE")), ]

#      A   B_down C_down  D_down  E  
#[1,] "1" "TRUE" "FALSE" "TRUE"  "a"
#[2,] "3" "TRUE" "FALSE" "FALSE" "c"
#[3,] "4" "TRUE" "TRUE"  "TRUE"  "d"

另一种方法是

df[rowSums(df[, endsWith(colnames(df), "_down")] == "TRUE") > 0, ]

#      A   B_down C_down  D_down  E  
#[1,] "1" "TRUE" "FALSE" "TRUE"  "a"
#[2,] "3" "TRUE" "FALSE" "FALSE" "c"
#[3,] "4" "TRUE" "TRUE"  "TRUE"  "d"