R语言:多列用apply结合ifelse批量替换值的技术问询
Hey there! I totally get how apply functions can feel intimidating when you're just starting out—let's walk through a couple of straightforward ways to solve your problem. You've already nailed the first step by identifying the flag columns with grep, so we'll build right on that.
Base R Approach (No Extra Packages Needed)
First, let's capture the actual names of those flag columns (not just their indices) to make our loop more readable:
flaggs2015 <- grep("Flag", names(ItemStats_2015)) flag_col_names <- names(ItemStats_2015)[flaggs2015]
Next, we'll use lapply to iterate over each flag column, replacing every "Y" with the last character of the column's name. We'll assign the result back to the original columns in your data frame:
ItemStats_2015[flag_col_names] <- lapply(flag_col_names, function(col) { # Grab the last character of the column name last_char <- substr(col, nchar(col), nchar(col)) # Replace "Y" with the last character, leave other values as-is ifelse(ItemStats_2015[[col]] == "Y", last_char, ItemStats_2015[[col]]) })
The key here is using [[col]] instead of $—since col is a variable holding the column name, [[ ]] lets us dynamically reference the column in the data frame, which is essential for batch processing.
Tidyverse (dplyr) Approach
If you're open to using the tidyverse, this method feels a bit more intuitive and readable:
library(dplyr) ItemStats_2015 <- ItemStats_2015 %>% # Target all columns that contain "Flag" in their name mutate_at(vars(contains("Flag")), function(col) { # Get the current column's name with dplyr's cur_column() current_col <- cur_column() last_char <- substr(current_col, nchar(current_col), nchar(current_col)) ifelse(col == "Y", last_char, col) })
mutate_at lets us specify which columns to modify (using contains("Flag") to match your original grep logic), and cur_column() automatically grabs the name of the column we're currently processing—no need to pass column names manually.
Both methods will do exactly what you need: batch-process all your flag columns, replacing "Y" with the final character of each column's name.
内容的提问来源于stack exchange,提问作者alexb523

