如何在R语言data.frame中选择行?以及如何筛选满足特定数值条件的行
Hey there! Let's break down your two R questions step by step—super common tasks, so I'll make sure the examples are easy to follow.
1. How to Select Rows in an R Data Frame?
There are three go-to methods for row selection, covering both base R and tidyverse workflows:
Square Bracket Indexing (Base R)
This is the most straightforward approach. The syntax is df[rows, columns]—leave the columns part blank to keep all columns.
- Select specific rows by position:
# Sample data frame for testing df <- data.frame(col1 = c(0,1,0,0), col2 = c(0,0,1,0), col3 = c(0,0,0,1), col4 = c(0,1,0,0)) # Pick rows 1 and 3 df[c(1,3), ] - Select rows based on a single condition (e.g., rows where
col1equals 1):df[df$col1 == 1, ]
subset() Function (Base R)
For more readable conditional selection, use base R's subset():
# Keep rows where col2 is 0 subset(df, col2 == 0)
dplyr::filter() (Tidyverse)
If you’re using the tidyverse, filter() is intuitive and great for complex logic:
library(dplyr) # Select rows where col3 equals 1 df %>% filter(col3 == 1)
2. How to Filter Rows Meeting Either of Your Specified Conditions?
Your requirements are:
- Condition 1: At least one column has a value of 1
- Condition 2: All columns have values of 0
Here are clean solutions for both base R and dplyr:
Base R Solution
Use rowSums() to efficiently check both conditions in one go:
# Calculate the sum of values for each row row_total <- rowSums(df) # Keep rows where sum is ≥1 (at least one 1) OR sum is 0 (all 0s) filtered_df <- df[row_total >= 1 | row_total == 0, ]
Tidyverse (dplyr) Solution
For a more human-readable approach, use if_any() and if_all() (available in dplyr 1.0.0+):
filtered_df <- df %>% filter(if_any(everything(), ~ .x == 1) | if_all(everything(), ~ .x == 0))
This reads almost like plain English: keep rows where any column is 1 OR all columns are 0—exactly what you need.
内容的提问来源于stack exchange,提问作者Mskhvilidze

