This uses the data.table
package and should be relatively quick.
Do check your column types because the example data you gave gets converted to a factor
variable (so I used stringsAsFactors=FALSE
when recreating it).
require(data.table)
dt <- data.table( data , key = "ID" )
dt[ dt[ , list( Keyword = unlist( strsplit( Text , " " ) ) ) , by = ID ] ]
# ID Text Keyword
# 1: S1 reuce FR563 323 aldk reuce
# 2: S1 reuce FR563 323 aldk FR563
# 3: S1 reuce FR563 323 aldk 323
# 4: S1 reuce FR563 323 aldk aldk
# 5: S2 vard 432 vard
# 6: S2 vard 432 432
# 7: S3 DK123 fg4d DK123
# 8: S3 DK123 fg4d fg4d
# 9: S4 matten global height matten
#10: S4 matten global height global
#11: S4 matten global height height