Как построить фрейм данных, содержащий список внутри столбца на несколько столбцов в R? - PullRequest
1 голос
/ 11 апреля 2019

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

У меня есть следующие данные:

vsn                             address         coordinates
53 079 Ashland Ave & Elston Ave Chicago IL -87.66826, 41.91873
76 097     Pulaski Rd & 71st St Chicago IL -87.72242, 41.76412
84 0A3  Long Ave & Lawrence Ave Chicago IL -87.76257, 41.96759

столбец координат содержит список, который мне нужен для преобразования данныхв следующее:

vsn                             address        Lat       Lon  
53 079 Ashland Ave & Elston Ave Chicago IL -87.66826 41.91873
76 097     Pulaski Rd & 71st St Chicago IL -87.72242 41.76412
84 0A3  Long Ave & Lawrence Ave Chicago IL -87.76257 41.96759

Я не знаю, как извлечь данные, потому что это фрейм данных, в частности то, что показано ниже

Тип координат столбца показан ниже:

вывод dput (данные $ координаты)

structure(list(coordinates = list(c(-87.668257, 41.918733), c(-87.72242, 
41.764122), c(-87.76257, 41.96759))), row.names = c(53L, 76L, 
84L), class = "data.frame")

Ответы [ 4 ]

0 голосов
/ 11 апреля 2019

Одна возможность: map_df() для разделения столбцов, затем cbind() результат для исходного фрейма данных.

library(dplyr)
library(purrr)

# Example Data
X <- data_frame(
    vsn = c(53, 76, 84),
    coordinates = map(1:3, ~ as.list(rnorm(2)))
)

# Create a new data frame from the list column
purrr::map_df(X$coordinates, ~ data_frame(Lat = .x[[1]], Lon = .x[[2]]))
# A tibble: 3 x 2
    Lat   Lon
  <dbl> <dbl>
1 -1.03 1.45 
2 -1.17 0.794
3  2.06 0.646

Затем cbind() для объединения с исходным фреймом данных

cbind(X, purrr::map_df(X$coordinates, ~ data_frame(Lat = .x[[1]], Lon = .x[[2]])))
  vsn           coordinates       Lat       Lon
1  53   -1.034076, 1.451652 -1.034076 1.4516519
2  76 -1.1738099, 0.7943916 -1.173810 0.7943916
3  84  2.0586963, 0.6462277  2.058696 0.6462277
0 голосов
/ 11 апреля 2019

Мы можем использовать separate

> library(tidyverse)
    > dat %>% 
    separate(coordinates, c("Lat", "Lon"), sep=",") %>% 
    mutate(Lat = as.numeric(Lat),
           Lon = as.numeric(Lon))
# A tibble: 3 x 4
  vsn    address                               Lat   Lon
  <chr>  <chr>                               <dbl> <dbl>
1 53 079 Ashland Ave & Elston Ave Chicago IL -87.7  41.9
2 76 097 Pulaski Rd & 71st St Chicago IL     -87.7  41.8
3 84 0A3 Long Ave & Lawrence Ave Chicago IL  -87.8  42.0

Обновление

Учитывая вашу версию вашего вопроса, вот базовое решение R

> out <- as.data.frame(do.call(rbind, dat$coordinates))
> names(out) <- c("Lat", "Lon")
> out
        Lat      Lon
1 -87.66826 41.91873
2 -87.72242 41.76412
3 -87.76257 41.96759
0 голосов
/ 11 апреля 2019

Поскольку входные данные не были воспроизведены в вопросе воспроизводимым образом, возникает вопрос относительно того, является ли столбец coordinates на самом деле списком, как указано в вопросе, или что на самом деле имелось в виду, что это столбец, разделенный запятымисимвольные строки.В конце примечания мы показываем оба воспроизводимых элемента, а здесь мы показываем, как обрабатывать оба случая:

координат - это столбец строк символов

library(dplyr)
library(tidyr)

DFstring %>%
  separate(coordinates, c("Lat", "Lon"), sep = ", ", convert = TRUE)

, что дает:

  vsn                             address       Lat      Lon
1 079 Ashland Ave & Elston Ave Chicago IL -87.66826 41.91873
2 097     Pulaski Rd & 71st St Chicago IL -87.72242 41.76412
3 0A3  Long Ave & Lawrence Ave Chicago IL -87.76257 41.96759

столбец координат представляет собой список

library(dplyr)

DFlist %>%
  rowwise %>%
  mutate(Lat = as.numeric(coordinates[1]), Lon = as.numeric(coordinates[2])) %>%
  ungroup %>%
  select(-coordinates)

, дающий:

# A tibble: 3 x 4
  vsn   address                               Lat   Lon
  <chr> <chr>                               <dbl> <dbl>
1 079   Ashland Ave & Elston Ave Chicago IL -87.7  41.9
2 097   Pulaski Rd & 71st St Chicago IL     -87.7  41.8
3 0A3   Long Ave & Lawrence Ave Chicago IL  -87.8  42.0

Примечание

Lines <- "vsn;address;coordinates
079;Ashland Ave & Elston Ave Chicago IL;-87.66826, 41.91873
097;Pulaski Rd & 71st St Chicago IL;-87.72242, 41.76412
0A3;Long Ave & Lawrence Ave Chicago IL;-87.76257, 41.96759"

DFstring <- read.table(text = Lines, header = TRUE, sep = ";", as.is = TRUE,
  strip.white = TRUE)

DFlist <- DFstring
DFlist$coordinates <- strsplit(DFstring$coordinates, ", ")

Обновление

Обратите внимание, что код ужеопубликованный выше работает с выводом dput, который был добавлен к вопросу.

DF <-
structure(list(coordinates = list(c(-87.668257, 41.918733), c(-87.72242, 
41.764122), c(-87.76257, 41.96759))), row.names = c(53L, 76L, 
84L), class = "data.frame")

# same as code above except we use DF as the input
DF %>%
  rowwise %>%
  mutate(Lat = as.numeric(coordinates[1]), Lon = as.numeric(coordinates[2])) %>%
  ungroup %>%
  select(-coordinates)

, давая:

# A tibble: 3 x 2
    Lat   Lon
  <dbl> <dbl>
1 -87.7  41.9
2 -87.7  41.8
3 -87.8  42.0
0 голосов
/ 11 апреля 2019

Попробуйте это-

   > library(splitstackshape)
   > cSplit(dt,"Coordinates")

Примечание - Эта функция также может помочь вам trim пробелов во время разделения.

Проверьте ?cSplit для получения дополнительной помощи.

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