我有一个数据框,我想通过选择所有实例来减小其大小,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”)),但这仅提供了部分数据帧。我希望像上面那样维护整个数据框结构。
谢谢您的帮助。
答案 0 :(得分:3)
我们可以将type.convert
与is.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"