Извлечь данные списка из столбца - PullRequest
0 голосов
/ 03 июля 2018

У меня есть фрейм данных, который выглядит очень похоже на это (в основном это таблица городов и их координат на карте. Обратите внимание, что координаты - это список значений X, Y.

foo <- data.frame(
  city = c("chicago", "new york"), 
  coordinate = I(list(list(10, 15), list(20, 25))), 
  myabbr = c("chi", "ny")
)

bar <- subset(foo, select=c("city", "coordinate"))

Прямо сейчас я могу создать новую таблицу только с указанием города и координат. Я действительно хочу, чтобы значения X и Y были отдельным столбцом. Это то, что я пытался

bar <- subset(foo, select=c("city", "coordinate[1]", "coordinate[2]"))

Хотя я не совсем уверен, как это сделать.

Ответы [ 7 ]

0 голосов
/ 03 июля 2018

Еще один вариант для вас, используйте listCol_w из splitstackshape.

library(splitstackshape)
listCol_w(foo, "coordinate")
#       city myabbr coordinate_fl_1 coordinate_fl_2
#1:  chicago    chi              10              15
#2: new york     ny              20              25
0 голосов
/ 03 июля 2018
bar%>%
   group_by(city)%>%
   mutate(coordinate=list(unlist(coordinate)),
          n=list(paste0("coordinate",1:lengths(coordinate))))%>%
   unnest%>%
   spread(n,coordinate)

# A tibble: 2 x 3
# Groups:   city [2]
  city     coordinate1 coordinate2
  <fct>          <dbl>       <dbl>
1 chicago          10.         15.
2 new york         20.         25.
0 голосов
/ 03 июля 2018

Вы также можете попробовать тидиверс

library(tidyverse)

foo %>% 
   mutate(coordinate=map(coordinate,~unlist(.) %>% 
                      paste(., collapse=","))) %>% 
   separate(coordinate, into = c("x", "y"), sep=",")
# A tibble: 2 x 4
  city     x     y     myabbr
  <fct>    <chr> <chr> <fct> 
1 chicago  10    15    chi   
2 new york 20    25    ny  

Это дает ожидаемый результат

.Last.value %>% 
select(-myabbr)
0 голосов
/ 03 июля 2018

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

cbind(foo, do.call(rbind, lapply(foo$coordinate, unlist)))
#       city coordinate myabbr  1  2
# 1  chicago     10, 15    chi 10 15
# 2 new york     20, 25     ny 20 25
0 голосов
/ 03 июля 2018

Идея здесь в том, чтобы unlist каждый ряд ваших координат и cbind, что с городами, т.е.

cbind(city = as.character(bar$city), 
      setNames(data.frame(apply(bar, 1, function(i)unlist(i$coordinate))), 
               c('coordinate1', 'coordinate2')))

, что дает,

      city coordinate1 coordinate2
1  chicago          10          20
2 new york          15          25
0 голосов
/ 03 июля 2018

То, что вам нужно, это извлечь элементы X и Y из списка столбца "координата". Извлечение списка выполняется как list[[index]] в R.

т.е.

foo <- data.frame(city=c("chicago", "new york"), coordinate=I(list(list(10, 15), list(20,25))), myabbr=c("chi", "ny"))

bar <- subset(foo, select=c("city", "coordinate"))

bar$x <- bar$coordinate[[1]]
bar$y <- bar$coordinate[[2]]

bar$coordinate <- NULL
0 голосов
/ 03 июля 2018

Вы можете получить доступ к элементу списка с помощью list[[index]]. В вашем случае вы можете извлечь его так:

foo <- data.frame(city=c("chicago", "new york"), coordinate=I(list(list(10, 15), list(20,25))), myabbr=c("chi", "ny"))
foo$coordinate_x = foo$coordinate[[1]]
foo$coordinate_y = foo$coordinate[[2]]
foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...