Преобразование фрейма данных в список матриц

#r #dataframe #matrix #tidyr #self-organizing-maps

Вопрос:

Как создать ежедневную числовую матрицу из фрейма данных с x , y date , и value столбцами. Я пытаюсь реализовать функцию SOM из пакета Кохонена в R для моего фрейма данных dtt . Для этого требуется матрица данных в качестве входных данных. Итак, как я могу преобразовать dtt в ежедневную матрицу на основе групп x и y, чтобы реализовать функцию SOM? Примеры данных и кода.

 dtt <-structure(list(x = c(-175, -174, -176, -175, -174, -173, -177, 
-176, -176, -175, -175, -174, -174, -173, -173, -178, -177, -176, 
-175, -174, -173, -178, -177, -176, -175, -174, -173, -177, -176, 
-175), y = c(55, 55, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 
53, 53, 53, 52, 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 50, 
50, 50), date = structure(c(9651, 9651, 9651, 9651, 9651, 9651, 
9652, 9651, 9652, 9651, 9652, 9651, 9652, 9651, 9652, 9652, 9652, 
9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 
9652, 9652), class = "Date"), value = c(316.613647460938, 316.79248046875, 
317.312530517578, 318.800598144531, 318.795593261719, 317.331817626953, 
317.249206542969, 317.226287841797, 320.043701171875, 318.493255615234, 
321.331146240234, 318.14208984375, 321.068939208984, 316.213836669922, 
319.203460693359, 316.927764892578, 320.787109375, 323.020355224609, 
323.617523193359, 322.588897705078, 319.979583740234, 318.035278320312, 
321.262054443359, 322.785919189453, 322.615661621094, 320.828125, 
317.512573242188, 318.32177734375, 319.274078369141, 318.411285400391
)), row.names = c(NA, -30L), class = c("tbl_df", "tbl", "data.frame"
))
 

Неудачный код для преобразования в матрицу.

 dtt_mat <- dtt %>% 
  group_by(x, y)%>%
  mutate(value = scale(value))%>%
  unite("xy", c(x,y), sep = "_") %>%
  tidyr::pivot_wider(names_from = xy, values_from = value)%>%
  dplyr::select(-date) %>% 
  as.matrix()
dtt_mat
str(dtt_mat)
 

Реализация SOM выдает ошибку, поскольку матрица dtt_mat не является правильной

 library(kohonen)
som_res <- som(X = dtt_mat,
               grid = somgrid(xdim = 2, ydim = 2, topo = "rectangular"),
               keep.data = T)

som_res
 

Комментарии:

1. NaN После scale i. e есть некоторые значения, где количество элементов в группах равно 1

2. Процент NA в данных очень высок rowMeans(is.na(dtt_mat))# [1] 0.8461538 0.8461538 , где maxNA.fraction по умолчанию 0, т. е. the maximal fraction of values that may be NA to prevent the row to be removed.

Ответ №1:

Вы можете использовать data.matrix() .

 library('kohonen')
som_res <- som(X=data.matrix(dtt),
               grid=somgrid(xdim=2, ydim=2, topo="rectangular"),
               keep.data=T)

som_res
# SOM of size 2x2 with a rectangular topology.
# Training data included.

str(som_res)
# List of 13
# $ data            :List of 1
# ..$ : num [1:30, 1:4] -175 -174 -176 -175 -174 -173 -177 -176 -176 -175 ...
# .. ..- attr(*, "dimnames")=List of 2
# .. .. ..$ : NULL
# .. .. ..$ : chr [1:4] "x" "y" "date" "value"
# $ unit.classif    : num [1:30] 4 4 4 4 3 3 4 4 2 4 ...
# $ distances       : num [1:30] 2.257 3.86 0.378 1.932 2.422 ...
# $ grid            :List of 6
# ..$ pts              : int [1:4, 1:2] 1 2 1 2 1 1 2 2
# .. ..- attr(*, "dimnames")=List of 2
# .. .. ..$ : NULL
# .. .. ..$ : chr [1:2] "x" "y"
# ..$ xdim             : num 2
# ..$ ydim             : num 2
# ..$ topo             : chr "rectangular"
# ..$ neighbourhood.fct: Factor w/ 2 levels "bubble","gaussian": 1
# ..$ toroidal         : logi FALSE
# ..- attr(*, "class")= chr "somgrid"
# $ codes           :List of 1
# ..$ : num [1:4, 1:4] -174.8 -176.7 -173.3 -175.4 51.9 ...
# .. ..- attr(*, "dimnames")=List of 2
# .. .. ..$ : chr [1:4] "V1" "V2" "V3" "V4"
# .. .. ..$ : chr [1:4] "x" "y" "date" "value"
# $ changes         : num [1:100, 1] 0.249 0.193 0.177 0.167 0.158 ...
# $ alpha           : num [1:2] 0.05 0.01
# $ radius          : Named num [1:2] 1 0
# ..- attr(*, "names")= chr [1:2] "66.66667%" ""
# $ user.weights    : num 1
# $ distance.weights: num 1
# $ whatmap         : int 1
# $ maxNA.fraction  : int 0
# $ dist.fcts       : chr "sumofsquares"
# - attr(*, "class")= chr "kohonen"