Трябва да се изгради структура от данни в 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