Матрица внутри data.frame в R или другой вложенной структуре

Мне нужно построить структуру данных в R, содержащую matrix (или же data.frame) для каждого наблюдения. В идеале это было бы matrix внутри data.frame, Пока что я могу думать только о вложенных списках, чтобы достичь этого, но тогда я боюсь, что производительность будет плохой.

пример

Например, для элемента data.frame

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

Я хотел бы добавить столбец, содержащий матрицу в каждой ячейке (в результате функции расстояния). Например, для элемента start=="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

Теоретически, это была бы какая-то трехмерная структура данных. В Python это был бы список списков, содержащих NumPy-array. Возможно ли что-то подобное в R?

Фон

Я хочу выполнить knn с пользовательской функцией расстояния, и мне нужно нормализовать расстояния перед выполнением knn

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

Если у вас уже есть вложенный список:

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
Другие вопросы по тегам