Tengo un data.frame con 100 columnas que siguen la convención word
y word_answer
df <- data.frame(apple = "57%", apple_answer = "22%", dog = "82%", dog_answer = "16%")
Establezco los niveles de las dos variables de factores anteriores así:
levels(df$apple) <- c( "66%","57%","48%","39%","30%","22%","12%" )
levels(df$dog) <- c( "82%","71%","60%","49%","38%","27%","16%" )
Estoy tratando de calcular una puntuación de distancia que es la distancia entre el nivel numérico de un factor de word
y el nivel numérico de su word_answer.
correspondiente
Entonces, por ejemplo, en el caso de la respuesta "manzana", la primera fila para apple
es "57%", que es el segundo nivel de factor en ese factor
> which(levels(df$apple) == "57%")
[1] 2
La columna correspondiente apple_answer
tiene un nivel de factor de 6
> which(levels(df$apple) == "22%")
[1] 6
Entonces la puntuación de distancia en este caso sería 2-6 = -4
¿Cómo puedo calcular estos puntajes de distancia para cada variable en mi conjunto de datos?
2 respuestas
Puede dividir los datos en dos grupos, palabra y sus respuestas correspondientes. Use match
para obtener su posición y restar de cada valor y generar nuevas columnas.
answer_cols <- grep('_answer', names(df))
new_cols <- paste0(names(df)[-answer_cols], '_dist')
df[new_cols] <- Map(function(x, y) match(x, levels(x)) - match(y, levels(x)),
df[-answer_cols], df[answer_cols])
df
# apple apple_answer dog dog_answer apple_dist dog_dist
#1 57% 22% 82% 16% -4 -6
También puede usar la función aplicar , de esta manera:
df$apple_dist = apply(df[,1:2], 1, function(x) {
which(levels(df$apple) == x[1]) - which(levels(df$apple) == x[2])
})
df$dog_dist = apply(df[,3:4], 1, function(x) {
which(levels(df$dog) == x[1]) - which(levels(df$dog) == x[2])
})
> df
apple apple_answer dog dog_answer apple_dist dog_dist
1 57% 22% 82% 16% -4 -6
Nuevas preguntas
r
R es un entorno de software y lenguaje de programación de código abierto y gratuito para computación estadística, bioinformática, visualización y computación en general. Proporcione ejemplos mínimos y reproducibles junto con el resultado deseado. Use dput () para los datos y especifique todos los paquetes no base con llamadas a library (). No incruste imágenes para datos o código, use bloques de código con sangría en su lugar. Para preguntas relacionadas con estadísticas, use https://stats.stackexchange.com.