簡體   English   中英

在 R 中的 dataframe 的任何列中過濾包含特定 boolean 值的行

[英]Filter rows that contain specific boolean value in any column in a dataframe in R

假設我有一個數據框:

data <- data.frame(w = c(1, 2, 3, 4), x = c(F, F, F, F), y = c(T, T, F, T), 
                   z = c(T, F, F, T), z1 = c(12, 4, 5, 15))

data
#>   w     x     y     z z1
#> 1 1 FALSE  TRUE  TRUE 12
#> 2 2 FALSE  TRUE FALSE  4
#> 3 3 FALSE FALSE FALSE  5
#> 4 4 FALSE  TRUE  TRUE 15

問題

如何過濾所有 boolean 變量為FALSE的行? 在這種情況下, row 3 或者換句話說,我想得到一個每行至少有一個TRUE值的數據框。

預期 output

#>   w     x     y     z z1
#> 1 1 FALSE  TRUE  TRUE 12
#> 2 2 FALSE  TRUE FALSE  4
#> 3 4 FALSE  TRUE  TRUE 15

試圖

library(tidyverse)
data %>% filter(x == T | y == T | z == T)

#>  w     x    y     z z1
#> 1 1 FALSE TRUE  TRUE 12
#> 2 2 FALSE TRUE FALSE  4
#> 3 4 FALSE TRUE  TRUE 15

以上是一個可行的選擇,但根本不可擴展。 使用dplyr's filter() function 是否有更方便的選擇?

rowSums()是一個不錯的選擇 - TRUE 為 1,FALSE 為 0。

cols = c("x", "y", "z")

## all FALSE
df[rowSums[cols] == 0, ]

## at least 1 TRUE
df[rowSums[cols] >= 1, ]

## etc.

使用dplyr ,我會使用這樣的相同想法:

df %>%
  filter(
    rowSums(. %>% select(all_of(cols))) >= 1
  )
# after @Gregor Thomas's suggestion on using TRUE or FALSE
df[!(apply(!df[, c('x', 'y', 'z')], 1, all)), ]

# without rowSums
df[!(apply(df[, c('x', 'y', 'z')] == FALSE, 1, all)), ]

# with rowSums
df[rowSums(df[, c('x', 'y', 'z')] == FALSE) != 3, ]
#  w     x    y     z z1
#1 1 FALSE TRUE  TRUE 12
#2 2 FALSE TRUE FALSE  4
#4 4 FALSE TRUE  TRUE 15

使用 dplyr 的filter()

library(dplyr)

filter(data, (x + y + z) > 0 )

  w     x    y     z z1
1 1 FALSE TRUE  TRUE 12
2 2 FALSE TRUE FALSE  4
3 4 FALSE TRUE  TRUE 15

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM