在r中以整洁的方式从列表列到数据帧
问题: 我想将列从命名列表转换为数据帧。但是现在只有9项,当列表中的变量最多为120时,在其他情况下会出现问题那么,有没有一种有效的方法来提取列表中的所有变量,而不逐个调用所有变量? 这是在r中以整洁的方式从列表列到数据帧,r,list,dataframe,dplyr,purrr,R,List,Dataframe,Dplyr,Purrr,问题: 我想将列从命名列表转换为数据帧。但是现在只有9项,当列表中的变量最多为120时,在其他情况下会出现问题那么,有没有一种有效的方法来提取列表中的所有变量,而不逐个调用所有变量? 这是FOO的DPUT: foo#A tibble:3x2 #>列a列b列 #> #>1A #>2 b #>3 c str(foo[1,]) #>类“tbl_df”、“tbl”和“data.frame”:1 obs。共有2个变量: #>$column_a:chr“a” #>$colu
FOO的DPUT
:
foo#A tibble:3x2
#>列a列b列
#>
#>1A
#>2 b
#>3 c
str(foo[1,])
#>类“tbl_df”、“tbl”和“data.frame”:1 obs。共有2个变量:
#>$column_a:chr“a”
#>$column_b:1个列表
#>..$:9人名单
#> .. ..$ 国家代码:chr“US”
#> .. ..$ 网址:chr“https://api.twitter.com/1.1/geo/id/c3f37afa9efcf94b.json"
#> .. ..$ 国家:chr“美国”
#> .. ..$ 地点类型:chr“城市”
#> .. ..$ 边界框:2个的列表
#> .. .. ..$ 类型:chr“多边形”
#> .. .. ..$ 坐标:num[1,1:4,1:2]-97.9-97.9-97.6-97.630.1。。。
#> .. ..$ 全名:chr“德克萨斯州奥斯汀”
#> .. ..$ 属性:命名列表()
#> .. ..$ id:chr“c3f37afa9efcf94b”
#> .. ..$ 姓名:chr“奥斯汀”
解决方案A:解决方案是调用列表中所有变量的名称,并使用map\u chr
逐个提取它们
foo%>%
变异(
国家代码=地图颜色(b列,“国家代码”),
国家=map\U chr(b列,“国家”)
)
#>#tibble:3 x 4
#>列a列b国家/地区代码国家/地区
#>
#>1美国
#>2 b乌干达
#>3 c美国
解决方案B:接下来,解决方案是在mutate
中调用两次map
函数。但我没有成功:
foo%>%
变异(回购信息=列b%>%
地图(~.x%>%
地图测向(`[`,c(“国家/地区代码”,“国家”)))%>%
选择(-column_b)%>%
unnest()
#>#tibble:6 x 10
#>列\u国家代码url国家地点\u类型边界\u框全名\u
#>
#>1A
#>2A
#>3 b
#>4 b
#>5 c
#>6 c
#>#…还有3个变量:属性、id、名称
由(v0.3.0)于2019-08-19创建的一个选项是在提取列后,将其转换为一个
tible
,然后执行unest
library(dplyr)
library(tidyr)
foo %>%
mutate(out = map(column_b, ~ .x[c( "country_code", "country")] %>%
as_tibble)) %>%
unnest(out)
# A tibble: 3 x 4
# column_a column_b country_code country
# <chr> <list> <chr> <chr>
#1 a <named list [9]> US United States
#2 b <named list [9]> UG Uganda
#3 c <named list [9]> US United States
库(dplyr)
图书馆(tidyr)
foo%>%
mutate(out=map(列b,~.x[c(“国家代码”,“国家”)]%>%
作为(不可分割的))%>%
不耐烦(不耐烦)
#一个tibble:3x4
#列a列b国家/地区代码国家/地区
#
#1美国
#2 b乌干达
#3 c美国
如果我们需要提取完整的列
library(tibble)
foo %>%
mutate(out = map(column_b, enframe)) %>%
unnest(out) %>%
spread(name, value) %>%
unnest(setdiff(names(.), c("column_b", "attributes","bounding_box")))
# A tibble: 3 x 11
# column_a column_b attributes bounding_box country country_code full_name id name place_type url
# <chr> <list> <list> <list> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#1 a <named list … <named list [… <named list [2… United St… US Austin, TX c3f37afa9… Austin city https://api.twitter.com/1.1/geo…
#2 b <named list … <named list [… <named list [2… Uganda UG Wakiso, Uga… 0092409a6… Wakiso admin https://api.twitter.com/1.1/geo…
#3 c <named list … <named list [… <named list [2… United St… US Bloomington… 080b8d854… Bloomin… city https://api.twitter.com/1.1/geo…
库(TIBLE)
foo%>%
突变(out=map(列b,enframe))%>%
未测试(输出)%>%
排列(名称、值)%>%
unnest(setdiff(名称(.)、c(“列b”、“属性”、“边界框”))
#一个tibble:3x11
#列a列b属性边界框国家代码全名id名称地点类型url
#
#1a这里有一个jsonlite
技巧(来回转换以使用来自json的功能)。
另外,数据最初是JSON吗?如果是,直接从JSON(flatte=TRUE)
读取可能更明智
library(jsonlite)
foo$column_b %>%
toJSON(auto_unbox = TRUE) %>%
fromJSON(flatten = TRUE)
# Observations: 3
# Variables: 9
# $ country_code <chr> "US", "UG", "US"
# $ url <chr> "https://api.twitter.com/1.1/geo/id/c3f37afa…
# $ country <chr> "United States", "Uganda", "United States"
# $ place_type <chr> "city", "admin", "city"
# $ full_name <chr> "Austin, TX", "Wakiso, Uganda", "Bloomington…
# $ id <chr> "c3f37afa9efcf94b", "0092409a629e836c", "080…
# $ name <chr> "Austin", "Wakiso", "Bloomington"
# $ bounding_box.type <chr> "Polygon", "Polygon", "Polygon"
# $ bounding_box.coordinates <list> [<array[1 x 4 x 2]>, <array[1 x 4 x 2]>, <a…
library(jsonlite)
foo$column_b%>%
toJSON(auto_unbox=TRUE)%%>%
fromJSON(展平=TRUE)
#意见:3
#变量:9
#$country_代码“US”、“UG”、“US”
#$url“https://api.twitter.com/1.1/geo/id/c3f37afa…
#$国家“美国”、“乌干达”、“美国”
#$place_类型“城市”、“管理”、“城市”
#$full_名称“德克萨斯州奥斯汀”、“乌干达瓦基索”、“布卢明顿……”…
#$id“c3f37afa9efcf94b”、“0092409a629e836c”、“080…”…
#$name“奥斯汀”、“瓦基索”、“布鲁明顿”
#$bounding\u box.type“Polygon”、“Polygon”、“Polygon”
#$bounding\u box.坐标[,这似乎是一个非常好的方法!有没有办法避免逐个调用所有变量?请发布此解决方案?这将非常好。提前感谢!@TitoSanz如果您有其他方法需要选择或排除列,您可以使用一些dplyr
选择帮助程序或基本方法,但这应该在您的q中uestion@TitoSanz对我来说,它在dpyr\u 0.8.3
purrr-0.3.2
和tidyr
'0.8.3.9000'@TitoSanz上运行良好。我使用的是tidyr
的开发版本。unest来自tidyr。因此,行为可能会改变吗