Извлечь данные списка из столбца

У меня есть фрейм данных, который очень похож на этот (в основном таблица городов и их координат на карте. Обратите внимание, что координаты - это список значений 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]"))

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

Можно попробовать что-нибудь вроде cbind(as.character(bar$city), apply(bar, 1, function(i)unlist(i$coordinate)))

Sotos 03.07.2018 11:42

Я дам этому шанс

Cameron 03.07.2018 11:42

Может cbind(foo, do.call(rbind, lapply(foo$coordinate, unlist)))?

zx8754 03.07.2018 11:42

Это сработало @ zx8754. Технически они оба работали, но у этого были правильные типы данных.

Cameron 03.07.2018 11:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
110
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы можете получить доступ к элементу списка с помощью 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

Что вам нужно, так это извлечь элементы 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

Спасибо! На самом деле это то, что я в итоге использовал!

Cameron 03.07.2018 11:58

Идея здесь заключается в том, чтобы 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

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

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

Вы также можете попробовать tidyverse

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)
Ответ принят как подходящий

Еще один вариант для вас - использовать 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

Поскольку вы зависите от очень специфичного пакета, я могу сказать вам, что большинство разработчиков R просто использовали бы внутреннюю функцию [[. Все поймут это, в то время как listCol_w нуждается в комментариях, чтобы его можно было понять или найти в справке.

Juergen 03.07.2018 12:06
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.

Другие вопросы по теме