从列中提取列表数据

时间:2018-07-03 09:36:46

标签: r

我有一个看起来与此非常相似的数据框(基本上是一张城市表及其在地图上的坐标。请注意,坐标是X,Y值的列表。

let alamofireSourceWihoutNils = alamofireSource.compactMap { $0 }

现在,我可以创建仅包含城市和坐标的新表。我真的希望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"))

我不确定该怎么做。

7 个答案:

答案 0 :(得分:5)

为您提供的另一个选择是,使用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

答案 1 :(得分:2)

您可以使用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

答案 2 :(得分:2)

您需要的是从列表列“坐标”中提取X和Y元素。像R中的list[[index]]一样完成列表提取。

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

答案 3 :(得分:2)

这里的想法是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

答案 4 :(得分:2)

我们可以取消列出该列并绑定回原始数据框,请尝试:

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

答案 5 :(得分:1)

您也可以尝试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)

答案 6 :(得分:1)

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.