R语言入门:如何将字符型变量driver重编码为driverrec
Hey there! Let's sort out this recoding problem for you. As an R beginner, it's totally common to get confused by the different syntax rules for recoding functions—let's break down what went wrong and give you a few straightforward solutions.
First, let's clarify the issue: you want to take your driver character variable (with values market, legislation, technology, mixed) and create a new driverrec variable where only market stays as-is, and all other categories are grouped into others.
Why Your Original Code Failed
It looks like you might be mixing up the syntax for different recode functions (there are a few in R, from packages like dplyr and car). Your attempt passed multiple separate strings as arguments, but most recode functions expect either:
- A single string with all mapping rules separated by semicolons (like
car::recode), or - Key-value pairs directly in the function call (like
dplyr::recode).
Let's jump into working solutions:
Solution 1: Use Base R (No Packages Needed)
This is the simplest approach if you don't want to load extra packages. Use ifelse() to check for the market value and assign others to everything else:
# Create the new variable directly in your data frame data$driverrec <- ifelse(data$driver == "market", "market", "others")
This works because ifelse() tests each element of data$driver: if it matches "market", it returns "market"; otherwise, it returns "others".
Solution 2: Use dplyr::recode (Tidyverse Style)
If you're using the tidyverse (a popular set of R packages for data manipulation), dplyr::recode is intuitive. You can list each mapping as a key-value pair:
library(dplyr) # Option 1: Explicitly map each category data$driverrec <- recode(data$driver, "market" = "market", "legislation" = "others", "technology" = "others", "mixed" = "others") # Option 2: More concise (great if you have many categories to group) # Create a named vector where keys are old values, values are new ones mapping <- c(legislation = "others", technology = "others", mixed = "others", market = "market") data$driverrec <- recode(data$driver, !!!mapping)
The !!! here tells dplyr to unpack the named vector into individual key-value pairs.
Solution 3: Use dplyr::case_when (Flexible for Complex Rules)
If you ever need more complex recoding logic later, case_when is extremely versatile. For your current problem, it looks like this:
library(dplyr) data$driverrec <- case_when( data$driver == "market" ~ "market", # Keep market as-is TRUE ~ "others" # All other cases go to others )
This reads like plain English: "When driver is 'market', use 'market'; for everything else, use 'others'."
Solution 4: Use car::recode (If You Prefer This Package)
If you want to stick with the recode function you referenced, make sure you're using car::recode and pass all rules in a single string separated by semicolons:
library(car) data$driverrec <- recode(data$driver, "'market'='market'; 'legislation'='others'; 'technology'='others'; 'mixed'='others'")
Note the single quotes around each value and semicolons separating each rule—this is the required syntax for car::recode.
All these methods will give you exactly the driverrec variable you need. I recommend starting with the base R ifelse() or dplyr::case_when since they're easier to read and debug as a beginner.
内容的提问来源于stack exchange,提问作者dholzer

