EDIT
Я только что понял, что оригинальный подход имеет проблему, когда activity_ids
содержит дополнительный бит информации. Например,
df$activity_ids[6] <- "{227,32,33,34,35,2521}"
mapply(function(x, y) grepl(y, tail(x, 1), fixed = TRUE),
strsplit(df$activity_ids, ","), df$activity_id)
#[1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
все равно вернет TRUE
, что неправильно.
Чтобы преодолеть это, мы можем вместо этого извлечь числовую часть последнего значения и затем сравнить ее с activity_id
mapply(function(x, y) y == sub("[^0-9]","",tail(x, 1)),
strsplit(df$activity_ids, ","), df$activity_id)
#[1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
df$activity_ids[6] <- "{227,32,33,34,35,2521}"
mapply(function(x, y) y == sub("[^0-9]","",tail(x, 1)),
strsplit(df$activity_ids, ","), df$activity_id)
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Оригинальный ответ
Опция без регулярного выражения будет разбивать строку на "," и принимать последнее значение, используя tail
, и проверять, существует ли оно в activity_id
с grepl
.
df$last_activity <- mapply(function(x, y) grepl(y, tail(x, 1), fixed = TRUE),
strsplit(df$activity_ids, ","), df$activity_id)
# activity_id activity_ids last_activity
#1 227 {227,32,33,34,35,252} FALSE
#2 32 {227,32,33,34,35,252} FALSE
#3 33 {227,32,33,34,35,252} FALSE
#4 34 {227,32,33,34,35,252} FALSE
#5 35 {227,32,33,34,35,252} FALSE
#6 252 {227,32,33,34,35,252} TRUE
#7 227 {227,32,33,34,35,252} FALSE
#8 32 {227,32,33,34,35,252} FALSE
#9 33 {227,32,33,34,35,252} FALSE
#10 34 {227,32,33,34,35,252} FALSE