Extraiga valores de diferentes columnas según el ID
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?
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.