Сначала вам нужно разделить столбец element
на ,
:
element_split <- strsplit(df1$element, ",")
Вы получаете список, и для каждого элемента этого списка вы можете искать элемент, начинающийся с S
(grep("^S", ...)
) и замените их соответствующим значением B
в вашем df2
(если его нет, то вы просто возвращаете элемент как есть):
l_element_B <- lapply(element_split,
function(x) if(any(y <- grep("^S", x))) {x[y] <- df2$B[match(x[y], df2$A)]; x} else x)
Затем вы можете свернуть свойэлементы с ,
, чтобы получить новый столбец (или сохранить его в виде списка, чтобы с ним было легче работать):
df1$new_element <- sapply(l_element_B, paste, collapse=",")
df1
# name element new_element
#1 m20895 P540554 P540554
#2 m20897 S01367 P00432
#3 m20907 P540554,P209332 P540554,P209332
#4 m20914 S01367,S01247 P00432,P00433
#5 m20915 S01247 P00433
#6 m20925 S00897 P00434
#7 m26943 P540554,P209332 P540554,P209332
#8 m26944 S00897,S00898,S00899,S00900 P00434,P00435,P00436,P00437
NB:
Конечно, вы можете напрямую изменить столбец, выполнив
df1$element <- sapply(l_element_B, paste, collapse=",")
вместо
df1$new_element <- sapply(l_element_B, paste, collapse=",")