Матрица внутри 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