Necesito construir una estructura de datos en R que contenga un matrix
(o data.frame
) para cada observación. Idealmente, sería un matrix
dentro de una data.frame
. Hasta el momento, solo puedo pensar en listas anidadas para lograrlo, pero luego tengo miedo de tener un bajo rendimiento.
Por ejemplo, para el elemento data.frame
df <- data.frame(start=c("A", "B", "C"), end=c("A", "B", "C"))
Me gustaría agregar una columna que contenga una matriz en cada celda (resultante de la función de distancia). Por ejemplo, para el elemento start == "A", end == "B" podría ser la matriz (o data.frame)
haversineStart haversineEnd tripLengthDiff startCountry endCountry truckDiff
160.5408 308.1947 198.745 1 1 1
152.4168 308.1947 20.710 1 1 1
273.7599 2228.3508 2903.212 0 1 1
Teóricamente, solo sería una especie de estructura de datos 3D. En Python, sería una lista de listas que contienen una NumPy
-formación. ¿Es algo así posible en R?
Fondo
Quiero realizar knn con una función de distancia personalizada y necesito normalizar las distancias antes de realizar la función knn
Respuestas
1 para la respuesta № 1Si ya tienes lista anidada:
d <- list(
a = list(matrix(rnorm(4), 2, 2), matrix(rnorm(4), 2, 2), matrix(rnorm(4), 2, 2)),
b = list(matrix(rnorm(4), 2, 2), matrix(rnorm(4), 2, 2), matrix(rnorm(4), 2, 2))
)
puede convertirlo en data.frame fácilmente, ya que data.frame sigue en la lista:
class(d) <- "data.frame"
colnames(d) <- c("A", "B")
rownames(d) <- c("A", "B", "C")
d["A", "B"]
# [[1]]
# [,1] [,2]
# [1,] -0.6326935 -1.1181986
# [2,] -1.3066515 0.6672159
1 para la respuesta № 2
Simplemente asigne una lista de matrices a una nueva columna en el data.frame. Por ejemplo, suponiendo df
de la pregunta:
m <- matrix(c(1, 12, 3, 14), 2)
df$mat <- list(m, 2*m, 3*m) # test list
asi que
> df$mat[[1]]
[,1] [,2]
[1,] 1 3
[2,] 12 14
> df[[1, "mat"]]
[,1] [,2]
[1,] 1 3
[2,] 12 14
> transform(df, det = sapply(mat, det))
start end mat det
1 A A 1, 12, 3, 14 -22
2 B B 2, 24, 6, 28 -88
3 C C 3, 36, 9, 42 -198