Обобщенное решение Base R, которое учитывает несколько строк с разными "Sname"
с.
res <- do.call(rbind, lapply(1:nrow(dat), function(x) {
x <- dat[x, ];cbind(x[1:2], rbind(x[3:5], x[6:8]), row.names=NULL)
}))
res
# Sname sid st.sn.s1 st.sn.s2 st.sn.s3
# 1 a 12 22 23 24
# 2 a 12 31 32 33
# 3 b 12 22 23 24
# 4 b 12 31 32 33
# 5 c 12 22 23 24
# 6 c 12 31 32 33
Данные:
dat <- structure(list(Sname = c("a", "b", "c"), sid = c(12L, 12L, 12L
), st.sn.s1 = c(22L, 22L, 22L), st.sn.s2 = c(23L, 23L, 23L),
st.sn.s3 = c(24L, 24L, 24L), st.sn.s1 = c(31L, 31L, 31L),
st.sn.s2 = c(32L, 32L, 32L), st.sn.s3 = c(33L, 33L, 33L)), row.names = c(NA,
-3L), class = "data.frame")