Extraiga valores de diferentes columnas según el ID

Resuelto Hann asked hace 54 años • 2 respuestas

Mi conjunto de datos contiene ID y muchas columnas que tienen ID en su nombre.

data = data.frame(ID = rep(1:3,2),
col1 = 1:6,
col2 = 7:12,
col3 = 13:18)

print(data)

Estoy intentando crear una variable basada en su ID de diferentes columnas.

data$new = c(1, 8, 15, 4, 11, 18)

Lo probé con dplyr usando get(paste0()), pero llama al vector completo, no al elemento específico.

data <- data %>% mutate(new = get(paste0("col",ID)))

También probé sapply pero nuevamente me da el vector, no el elemento.

data$new <- sapply(data$ID, function(x) get(paste0("col",ID),data)

¿Cómo puedo seleccionar el elemento de diferentes columnas por su ID?

Hann avatar Jan 01 '70 08:01 Hann
Aceptado

Puede utilizar su enfoque original rowwise()si lo desea, es decir

data %>% rowwise() %>% mutate(new = get(paste0("col",ID)))

También puedes hacer algo como:

data$new <- apply(data, 1, \(x) x[x[1]+1])

lo anterior solo funciona si solo tienes ID y las col<num>columnas, y están en orden. Si ese no es el caso, puedes hacer esto:

cols = sort(grep("col",names(data),value=T))
data$new <- apply(data[,c("ID", cols)], 1, \(x) x[x[1]+1])

Y, aunque no necesariamente lo recomendaría para su situación actual, a menudo es más fácil trabajar en algunos problemas como este cuando los datos están en formato largo:

bind_cols(
  select(data, ID, starts_with("col")),
  tidyr::pivot_longer(data,-ID,names_prefix = "col") %>% filter(name==ID) %>% select(new=value)
)

Todo lo anterior proporciona el mismo resultado.

langtang avatar Feb 16 '2024 15:02 langtang