I have a dataframe similar to the below
| ID | FirstName | LastName | Orders | Age |
|---|---|---|---|---|
| 1 | John | Smith | 3 | 30 |
| 2 | John | Smith | 7 | 8 |
| 3 | John | Smith | 9 | 317 |
| 4 | John | Smith | 12 | 20 |
I need to do the equivalent of a find and replace based on a number of IDs where if a match is found within the list, 'FirstName', 'LastName' and 'Age' are changed to value 'Redacted'. So I can start with setting up IDList like below with the necessary IDs:
IDList <- c(1,3,74,312)
But can anyone please advise how to code in order that final table would look like this:
| ID | FirstName | LastName | Orders | Age |
|---|---|---|---|---|
| 1 | Redacted | Redacted | 3 | Redacted |
| 2 | John | Smith | 7 | 8 |
| 3 | Redacted | Redacted | 9 | Redacted |
| 4 | John | Smith | 12 | 20 |
Thank you.
CodePudding user response:
You may make a single assignment here:
cols <- c("FirstName", "LastName", "Age")
df[df$ID %in% IDList, cols] <- "Redacted"
df
ID FirstName LastName Orders Age
1 1 Redacted Redacted 3 Redacted
2 2 John Smith 7 8
3 3 Redacted Redacted 9 Redacted
4 4 John Smith 12 20
Data:
df <- data.frame(ID=c(1:4), FirstName=rep("John", 4),
LastName=rep("Smith", 4), Orders=c(3,7,9,12),
Age=c(30,8,317,20), stringsAsFactors=FALSE)
IDList <- c(1,3,74,312)
CodePudding user response:
Here is a dplyr solution:
library(dplyr)
df %>%
mutate(across(c(FirstName, LastName, Age), ~ifelse(ID %in% IDList, "Redacted", .)))
ID FirstName LastName Orders Age
1 1 Redacted Redacted 3 Redacted
2 2 John Smith 7 8
3 3 Redacted Redacted 9 Redacted
4 4 John Smith 12 20
CodePudding user response:
Using simple base R
df$Age = ifelse(df$ID %in% IDList, 'Redacted', df$Age)
ID FirstName LastName Orders Age
1 1 John Smith 3 Redacted
2 2 John Smith 7 8
3 3 John Smith 9 Redacted
4 4 John Smith 12 20
