#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