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?

1
Parseltongue 23 jul. 2020 a las 05:28

2 respuestas

La mejor respuesta

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
1
Ronak Shah 23 jul. 2020 a las 02:36

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
1
Haci Duru 24 jul. 2020 a las 19:46