Как создать новый фрейм данных с четырьмя столбцами на основе элемента списка в R - PullRequest
0 голосов
/ 07 марта 2020

Итак, у меня есть список из 12 элементов (по одному на каждый месяц). Вот как выглядит январь: enter image description here

Столбцы представляют долготу, а строки представляют широту. Теперь я хочу создать фрейм данных, в котором есть один столбец для долготы и один столбец для широты, а один столбец представляет значение ie:

avg longitude latitude month 18.0 113.8W 36.2N Jan 11.0 113.8W 33.8N Jan

Мне нужно использовать это фрейм данных для построения графика 576 пар координат для каждого из 12 месяцев (т.е. 24 графика на 24 графика)

(дополнительный вопрос: я должен сделать координаты одним столбцом и представить его как (113.8W, 36.2 N) или оставить его как две отдельные колонки?)

Ответы [ 3 ]

1 голос
/ 07 марта 2020

Если ваш список называется list_df, мы можем присвоить им имена по месяцам, используя встроенный вектор month.abb. Используя lapply, мы можем преобразовать матрицу в фрейм данных с именем столбца, именем строки, значением в каждой ячейке и названием месяца. В конечном счете, мы можем rbind все данные вместе получить один кадр данных.

names(list_df) <- month.abb

do.call(rbind, lapply(seq_along(list_df), function(i) {
   mat <- list_df[[i]]
   data.frame(avg = c(mat), longitude = rep(colnames(mat), each = nrow(mat)), 
         latitude = rep(rownames(mat), ncol(mat)), month = names(list_df)[[i]])
}))
1 голос
/ 07 марта 2020

Вот способ tidyverse.

Повторное использование X от @Edward:

X <- matrix(rnorm(25, mean=12, sd=10), nr=5); X
rownames(X) <- c("36.2N","33.8N","31.2N","28.8N","26.2N")
colnames(X) <- c("113.8W","111.2W","108.8W","106.2W","103.8W")

И список таких матриц:

ll <- list(jan = X, feb = X, mar = X, apr = X)

Тогда Вы можете переформатировать с помощью:

ll %>%
  map(~ as_tibble(., rownames = "lat")) %>%
  map(~ pivot_longer(., 
                     cols = -lat, 
                     names_to = "long", 
                     values_to = "avg")) %>%
  bind_rows(.id = "month")

Что касается вашего дополнительного вопроса, в большинстве случаев вам, вероятно, лучше оставить широту и долготу в отдельных столбцах.

0 голосов
/ 07 марта 2020

Используйте stack, а затем добавьте широты. Предположим, это ваши данные:

X <- matrix(rnorm(25, mean=12, sd=10), nr=5); X
rownames(X) <- c("36.2N","33.8N","31.2N","28.8N","26.2N")
colnames(X) <- c("113.8W","111.2W","108.8W","106.2W","103.8W")
X
          113.8W    111.2W    108.8W    106.2W    103.8W
36.2N  1.0286035 12.766437  6.883963  5.847317  3.640007
33.8N 21.2551124 14.551648 14.369379 -6.068930 18.529475
31.2N 14.4679921 14.774468  6.584108  5.563189 16.412931
28.8N  4.6322846 17.368560 24.192276 32.460189 19.516291
26.2N -0.8000894  7.395144 13.741359  6.392376  9.220249

Это матрица. Преобразуйте в фрейм данных, затем сложите его.

data <- stack(as.data.frame(X))
data$lat <- rownames(X)
names(data)[2] <- "lon"
head(data)
      values    lon   lat
1  1.0286035 113.8W 36.2N
2 21.2551124 113.8W 33.8N
3 14.4679921 113.8W 31.2N
4  4.6322846 113.8W 28.8N
5 -0.8000894 113.8W 26.2N
6 12.7664366 111.2W 36.2N

Я думаю, что большинство функций в R предпочитают, чтобы столбцы были отдельными. Но вам может понадобиться убрать Восток / Запад и Север / Юг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...