матрица внутри данных.фрейм в R или другой вложенной структуре

#r #multidimensional-array #dataframe #distance #knn

#r #многомерный массив #dataframe #расстояние #knn

Вопрос:

Мне нужно построить структуру данных в R, содержащую matrix (или data.frame ) для каждого наблюдения. В идеале это было бы a matrix внутри a 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 это был бы список списков, содержащих a NumPy -array . Возможно ли что-то подобное в R?

Предыстория

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

Ответ №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
  

Ответ №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