Grant
Grant

Reputation: 45

substitute the elements of a vector with values from dataframe

I need to substitute the elements of a vector which match the elements of a particular column in data frame in R. Reproducible example:

a<-c("A","B","C","D")
b<-data.frame(col1=c("B","C","E"),col2=c("T","Y","N"))

I need to get the following vector:

new<-c("A","T","Y","D")

What I tried is:

new <- a
new <- b$col2[match(a, b$col1)]

which does the substitution, but converts the unmatched elements into NAs. Any help is appreciated

Upvotes: 2

Views: 140

Answers (2)

slava-kohut
slava-kohut

Reputation: 4233

You can use replace in base R:

a<-c("A","B","C","D")
b<-data.frame(col1=c("B","C","E"),col2=c("T","Y","N"), stringsAsFactors = F)

replace(a, which(a %in% b$col1), b$col2[b$col1 %in% a])

#[1] "A" "T" "Y" "D"

Upvotes: 1

IceCreamToucan
IceCreamToucan

Reputation: 28675

You can make a data.table from a and then update only the rows for which there is a match when joining with b.

library(data.table)
setDT(b)

data.table(a)[b, on = .(a = col1), a := i.col2][]
#    a
# 1: A
# 2: T
# 3: Y
# 4: D

In base R you could use your current approach but replace the NAs with elements of a using ifelse

temp <- as.character(b$col2[match(a, b$col1)])
ifelse(is.na(temp), a, temp)
# [1] "A" "T" "Y" "D"

Upvotes: 2

Related Questions