2016-10-09 2 views
0

Ich brauche eine Datenstruktur in R zu konstruieren a matrix (oder data.frame) für jede Beobachtung enthält. Idealerweise wäre es ein matrix in einem data.frame sein. Bisher kann ich nur an verschachtelte Listen denken, um es zu erreichen, aber dann habe ich Angst, schlechte Leistungen zu haben.Matrix innerhalb data.frame in R oder andere verschachtelte Struktur

Beispiel

beispielsweise für das Element data.frame

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

Ich mag würde eine Säule mit einer Matrix in jeder Zelle hinzuzufügen (die sich aus der Abstandsfunktion). Beispielsweise für das Element beginnen == „A“, Ende == „B“ Es könnte die Matrix (oder data.frame) seine

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 

Theoretisch wäre es nur eine Art von 3D-Datenstruktur sein. In Python wäre es Liste von Listen sein, einen NumPy -array enthalten. Ist so etwas in R möglich?

Hintergrund

Ich möchte mit einem benutzerdefinierten Abstand Funktion auszuführen knn und ich brauche die Abstände zu normalisieren, bevor die knn

Antwort

1

Wenn Sie bereits verschachtelte Liste durchführen haben:

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)) 
) 

können Sie konvertieren Sie es einfach data.frame, wie data.frame ist immer noch Liste:

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

einfach eine Liste von Matrizen zu einer neuen Spalte in den data.frame zuweisen. Wenn zum Beispiel angenommen df von der Frage:

m <- matrix(c(1, 12, 3, 14), 2) 
df$mat <- list(m, 2*m, 3*m) # test list 

so

> 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