subset marco de datos por patrón complejo de nombres de columna

Tengo un conjunto de datos que se parece a lo siguiente:

dos rondas de datos (.t0 y.t1)escalas múltiples (this ythat)varios artículos por escala (1, 22, 22a)varias variables para ignorar (v2, v3, ignore.t0, ignore.t1, this.t0, this.t1, that.t0, that.t1)

.

dat <- data.frame(id = seq(from=1, to=10, by=1),
                  v2 = rnorm(10),
                  v3 = rnorm(10),
                  ignore.t0 = rnorm(10),
                  this.t0 = rnorm(10),
                  this1.t0 = rnorm(10),
                  this22.t0 = rnorm(10),
                  this22a.t0 = rnorm(10),
                  that.t0 = rnorm(10),
                  that1.t0 = rnorm(10),
                  that22.t0 = rnorm(10),
                  that22a.t0 = rnorm(10),
                  ignore.t1 = rnorm(10),
                  this.t1 = rnorm(10),
                  this1.t1 = rnorm(10),
                  this22.t1 = rnorm(10),
                  this22a.t1 = rnorm(10),
                  that.t1 = rnorm(10),
                  that1.t1 = rnorm(10),
                  that22.t1 = rnorm(10),
                  that22a.t1 = rnorm(10))

Quiero subcontratar el marco de datos para incluirid y solo columnas con:

el nombre de la escala (this othat) Yun número (1.) O un número y una letra (22a.) antes del periodo

Así que al final, el marco de datos debería verse como:

dat2 <- data.frame(
                   id = seq(from=1, to=10, by=1),
                   #v2 = rnorm(10),
                   #v3 = rnorm(10),
                   #ignore.t0 = rnorm(10),
                   #this.t0 = rnorm(10),
                   this1.t0 = rnorm(10),
                   this22.t0 = rnorm(10),
                   this22a.t0 = rnorm(10),
                   #that.t0 = rnorm(10),
                   that1.t0 = rnorm(10),
                   that22.t0 = rnorm(10),
                   that22a.t0 = rnorm(10),
                   #ignore.t1 = rnorm(10),
                   #this.t1 = rnorm(10),
                   this1.t1 = rnorm(10),
                   this22.t1 = rnorm(10),
                   this22a.t1 = rnorm(10),
                   #that.t1 = rnorm(10),
                   that1.t1 = rnorm(10),
                   that22.t1 = rnorm(10),
                   that22a.t1 = rnorm(10))

El marco de datos es mucho más grande de lo que se representa aquí, por lo que no es posible escribir los índices de columna. Tampoco es posible simplemente buscar los nombres de escala porquethis.t0, this.t1, that.t0ythat.t1 sería atrapado

# not quite right
dat2$id <- dat$id
scales <- c("this", "that")
keep.index <- grep(paste(scales,collapse="|"), names(dat))
temp <- dat[keep.index]
dat2 <- cbind(dat2, temp)

¿Cómo puedo modificar el patrón grep para buscar un número O (número y carácter) antes del período? ¿O hay un mejor enfoque todos juntos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta