Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在r中以整洁的方式从列表列到数据帧_R_List_Dataframe_Dplyr_Purrr - Fatal编程技术网

在r中以整洁的方式从列表列到数据帧

在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

问题: 我想将列从命名列表转换为数据帧。但是现在只有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”
#>$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。因此,行为可能会改变吗