/ / матрица вътре в data.frame в R или друга вложена структура - r, многоизмерен масив, dataframe, разстояние, knn

матрица вътре в data.frame в R или друга вградена структура - r, мултидиметричен масив, dataframe, разстояние, knn

Трябва да се изгради структура от данни в R, съдържаща a matrix (или data.frame) за всяко наблюдение. В идеалния случай би било matrix вътре в data.frame, Досега мога да мисля само за вложени списъци, за да го постигна, но след това се страхувам да имам лошо представяне.

Например за елемента data.frame

df <- data.frame(start=c("A", "B", "C"), end=c("A", "B", "C"))

Бих искал да добавя колона, съдържаща матрица във всяка клетка (получена от функцията за разстояние). Например за начало на елемент == "A", end == "B" може да бъде матрицата (или 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

Теоретично би било просто някаква 3D структура на данните. В Python, това би било списък от списъци, съдържащи a NumPy-array. Възможно ли е нещо подобно в R?

Заден план

Искам да изпълня knn с персонализирана функция за разстояние и трябва да нормализирам разстоянията, преди да извърша knn

Отговори:

1 за отговор № 1

Ако вече имате вложен списък:

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))
)

можете лесно да го конвертирате в data.frame, тъй като data.frame е все още списък:

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 за отговор № 2

Просто задайте списък с матрици на нова колона в data.frame. Например, ако приемем df от въпроса:

m <- matrix(c(1, 12, 3, 14), 2)
df$mat <- list(m, 2*m, 3*m) # test list

така

> 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