У меня есть фрейм данных, который очень похож на этот (в основном таблица городов и их координат на карте. Обратите внимание, что координаты - это список значений 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(foo, do.call(rbind, lapply(foo$coordinate, unlist)))?
Это сработало @ zx8754. Технически они оба работали, но у этого были правильные типы данных.





Вы можете получить доступ к элементу списка с помощью 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
Спасибо! На самом деле это то, что я в итоге использовал!
Идея здесь заключается в том, чтобы 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 нуждается в комментариях, чтобы его можно было понять или найти в справке.
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.
Можно попробовать что-нибудь вроде
cbind(as.character(bar$city), apply(bar, 1, function(i)unlist(i$coordinate)))