R语言中按指定条件从多列筛选值并分配行ID的技术问询
Got it, let's walk through this step by step to get exactly what you need. We'll start by structuring your data, assign the IDs, then implement the conditional checks to filter rows and generate a new column.
Step 1: Set Up the Data Frame with IDs
First, we'll combine your columns into a data frame and add the ID#1 to ID#5 labels as requested:
# Define your original columns column1 <- c("rice 2", "apple 4", "melon 6", "blueberry 4", "orange 6") column2 <- c("rice 8", "blueberry 8", "grape 10", "water 10", "mango 3") column3 <- c("rice 6", "apple 8", "blueberry 12", "pineapple 8", "mango 3") # Create data frame with ID column df <- data.frame( ID = paste0("ID#", 1:5), column1 = column1, column2 = column2, column3 = column3, stringsAsFactors = FALSE )
Step 2: Define Conditional Checks
We need to check if any entry in a row meets one of these criteria:
rice > 5blueberry > 7orange > 5
We'll use a helper function to scan each row, split the food-value strings, and validate the conditions. We'll also use tidyverse for cleaner data manipulation (install it with install.packages("tidyverse") if you don't have it):
library(tidyverse) # Function to check if a row meets any of the conditions meets_condition <- function(row) { # Extract all food-value pairs from the row's columns all_pairs <- c(row["column1"], row["column2"], row["column3"]) # Split each pair into food name and numeric value split_pairs <- str_split(all_pairs, " ", simplify = TRUE) foods <- split_pairs[, 1] values <- as.numeric(split_pairs[, 2]) # Check if any pair matches the conditions any( (foods == "rice" & values > 5) | (foods == "blueberry" & values > 7) | (foods == "orange" & values > 5) ) }
Step 3: Generate New Column & Filter Rows
Now we'll add a new column to mark which rows meet the condition, then filter to keep only those rows (which will be ID#1, ID#2, ID#3, ID#5 as expected):
# Add column indicating if row meets conditions df$meets_condition <- apply(df, 1, meets_condition) # Filter to keep only qualifying rows filtered_df <- df %>% filter(meets_condition) # View the result print(filtered_df)
Output of Filtered Data Frame
ID column1 column2 column3 meets_condition 1 ID#1 rice 2 rice 8 rice 6 TRUE 2 ID#2 apple 4 blueberry 8 apple 8 TRUE 3 ID#3 melon 6 grape 10 blueberry 12 TRUE 4 ID#5 orange 6 mango 3 mango 3 TRUE
Optional: Add a Column with Valid Entries
If you want a new column that explicitly lists which entries satisfied the conditions (instead of just a TRUE/FALSE flag), use this extended function:
# Function to extract all valid food-value pairs for a row get_valid_entries <- function(row) { all_pairs <- c(row["column1"], row["column2"], row["column3"]) split_pairs <- str_split(all_pairs, " ", simplify = TRUE) foods <- split_pairs[, 1] values <- as.numeric(split_pairs[, 2]) # Filter and format valid pairs valid_pairs <- paste(foods, values)[ (foods == "rice" & values > 5) | (foods == "blueberry" & values > 7) | (foods == "orange" & values > 5) ] paste(valid_pairs, collapse = ", ") } # Add the detailed valid entries column df$valid_entries <- apply(df, 1, get_valid_entries) # Filter and view the enhanced result filtered_df <- df %>% filter(meets_condition) print(filtered_df)
Enhanced Output
ID column1 column2 column3 meets_condition valid_entries 1 ID#1 rice 2 rice 8 rice 6 TRUE rice 8, rice 6 2 ID#2 apple 4 blueberry 8 apple 8 TRUE blueberry 8 3 ID#3 melon 6 grape 10 blueberry 12 TRUE blueberry 12 4 ID#5 orange 6 mango 3 mango 3 TRUE orange 6
内容的提问来源于stack exchange,提问作者Charles

