You can do that with the plyr
package:
# reading the data
df <- read.table(text = "id name gender job1 sjob1 ejob1 job2 sjob2 ejob2 job3 sjob3 ejob3
1 Jane F 100 1990 1992 103 1993 1995 104 1994 1997
2 Tom M 200 1978 1980 400 1981 1985 NA NA NA", header = TRUE, strip.white = TRUE)
# needed package
require(plyr)
# transforming the data
df2 <- rbind(
ddply(df, .(id, name, gender), mutate, year = sjob1, job = job1),
ddply(df, .(id, name, gender), mutate, year = ejob1, job = job1),
ddply(df, .(id, name, gender), mutate, year = sjob2, job = job2),
ddply(df, .(id, name, gender), mutate, year = ejob2, job = job2),
ddply(df, .(id, name, gender), mutate, year = sjob3, job = job3),
ddply(df, .(id, name, gender), mutate, year = ejob3, job = job3)
)
# getting rid off NA's & ordering the dataframe by id
df2 <- na.omit(df2[order(df2$id),c(1:3,13,14)])