I you don't mind using 2 joins:
library(plyr)
# factors to character vectors:
name <- as.data.frame(sapply(name, as.character), stringsAsFactors=F)
# split comma-seperated ids into named list:
(tmp <- setNames(strsplit(name$key, ","), name$name))
# $jack
# [1] "a" "b" "c"
#
# $daniel
# [1] "d"
#
# $foo
# [1] "e"
#
# $bar
# [1] "f" "g"
# list to long 2-column data frame:
(tmp <- setNames(ldply(tmp, matrix), c("name", "key")) )
# name key
# 1 jack a
# 2 jack b
# 3 jack c
# 4 daniel d
# 5 foo e
# 6 bar f
# 7 bar g
# join data frame with age table (1st join) &
# add original comma-seperated key column (2nd join)
join(join(age, b, type="inner"),
name, by="name")[-1]
# age name key
# 1 13 jack a,b,c
# 2 21 daniel d
# 3 24 foo e
# 4 100 bar f,g