Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.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 类TIBLE的TIBLE列,而不是类数据帧_R_Dplyr_Nested_Purrr_Tibble - Fatal编程技术网

R 类TIBLE的TIBLE列,而不是类数据帧

R 类TIBLE的TIBLE列,而不是类数据帧,r,dplyr,nested,purrr,tibble,R,Dplyr,Nested,Purrr,Tibble,使用类tibble的tibble列(而不是类list或data.frame)的整洁方式是什么 显然,在tibbles中可以有classdata.frame列(参见 下面的例子),但没有“整洁的数据操作方式”(即。 当我尝试将列强制转换为tibble而不是data.frame时,dplyr::mutate()或purrr::map*.\u df() jsonlite::fromJSON()的当前输出 #“data.frame”:2个obs。共有3个变量: #$labels:2个标签的列表 #..$

使用类
tibble
tibble
列(而不是类
list
data.frame
)的整洁方式是什么

显然,在
tibble
s中可以有class
data.frame
列(参见 下面的例子),但没有“整洁的数据操作方式”(即。 当我尝试将列强制转换为
tibble
而不是
data.frame时,
dplyr::mutate()
purrr::map*.\u df()

jsonlite::fromJSON()的当前输出
#“data.frame”:2个obs。共有3个变量:
#$labels:2个标签的列表
#..$:chr“label-a”label-b
#..$:chr“label-a”label-b
#$levelOne:'data.frame':2个obs。第1个变量:
#..$levelTwo:'data.frame':2个obs。第1个变量:
#   .. ..$ 第三级:2人名单
#   .. .. ..$ :'data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:int 1 2
#   .. .. .. ..$ z:logi-TRUE-FALSE
#   .. .. ..$ :'data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:INT1020
#   .. .. .. ..$ z:logi假-真
#$schema:chr“0.0.1”0.0.1
期望结果
#类“tbl_df”、“tbl”和“data.frame”:2个obs。共有3个变量:
#$labels:2个标签的列表
#..$:chr“label-a”label-b
#..$:chr“label-a”label-b
#$levelOne:class'tbl_df'、'tbl'和'data.frame':2个obs。第1个变量:
#..$levelTwo:class'tbl_df'、'tbl'和'data.frame':2个obs。第1个变量:
#   .. ..$ 第三级:2人名单
#   .. .. ..$ :类“tbl_df”、“tbl”和“data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:int 1 2
#   .. .. .. ..$ z:logi-TRUE-FALSE
#   .. .. ..$ :类“tbl_df”、“tbl”和“data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:INT1020
#   .. .. .. ..$ z:logi假-真
#$schema:chr“0.0.1”0.0.1
为什么使用
data.frame
列会产生误导

相关的

例子 示例数据
库(magrittr)
json%
tibble::as_tibble()
x%>%str()
#类“tbl_df”、“tbl”和“data.frame”:2个obs。共有3个变量:
#$labels:2个标签的列表
#..$:chr“label-a”label-b
#..$:chr“label-a”label-b
#$levelOne:'data.frame':2个obs。第1个变量:
#..$levelTwo:'data.frame':2个obs。第1个变量:
#   .. ..$ 第三级:2人名单
#   .. .. ..$ :'data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:int 1 2
#   .. .. .. ..$ z:logi-TRUE-FALSE
#   .. .. ..$ :'data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:INT1020
#   .. .. .. ..$ z:logi假-真
#$schema:chr“0.0.1”0.0.1
因此,很明显,可以使用类
data.frame
的列

data.frame
转换为
tibble
列:“坏方法” 但是我想要的是tibbles而不是数据帧,所以让我们试试我仅有的东西 工作方式:显式重新分配相应的列表级别,或数据帧/TIBLE 列,更准确地说:

#复制一份,这样我们就不会弄乱'x'的初始状态`
y%str()
#类“tbl_df”、“tbl”和“data.frame”:2个obs。共有3个变量:
#$labels:2个标签的列表
#..$:chr“label-a”label-b
#..$:chr“label-a”label-b
#$levelOne:class'tbl_df'、'tbl'和'data.frame':2个obs。第1个变量:
#..$levelTwo:class'tbl_df'、'tbl'和'data.frame':2个obs。第1个变量:
#   .. ..$ 第三级:2人名单
#   .. .. ..$ :类“tbl_df”、“tbl”和“data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:int 1 2
#   .. .. .. ..$ z:logi-TRUE-FALSE
#   .. .. ..$ :类“tbl_df”、“tbl”和“data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:INT1020
#   .. .. .. ..$ z:logi假-真
#$schema:chr“0.0.1”0.0.1
这是可行的,但不符合“整洁的数据操作管道”

data.frame
转换为
tibble
列:“更好的方法”(尝试和失败)
#还有一份副本,我们可以比较:
z%
tibble::as_tibble()
##tible:2 x 1
#二级$三级
#                
# 1    
# 2    
#尝试使用'dplzr::mutate()'使其工作失败:
z%>%
dplyr::mutate(levelOne=levelOne%>%
tibble::as_tibble()
)
#错误:“levelOne”列属于不受支持的类data.frame
z%>%
dplyr::transmute(一级=一级%>%
tibble::as_tibble()
)
#错误:“levelOne”列属于不受支持的类data.frame
#“{purrr}”也是如此:
z%>%
dplyr::mutate(levelOne=levelOne%>%
purrr::map_df(tibble::as_tibble)
)
#错误:“levelOne”列属于不受支持的类data.frame
z%>%
tibble::add_列(levelOne=z$levelOne%>%tibble::as_tibble())
#错误:无法使用“add_column()”添加重复的列:
#*列“levelOne”已存在于“.data”中。
#有效,但不是我想要的:
z%>%
tibble::add_列(test=z$levelOne%%>%tibble::as_tibble())%%>%
str()
#类“tbl_df”、“tbl”和“data.frame”:2个obs。共有4个变量:
#  [...]
#$test:class'tbl_df'、'tbl'和'data.frame':2个obs。第1个变量:
#..$levelTwo:'data.frame':2个obs。第1个变量:
#   .. ..$ 第三级:2人名单
#   .. .. ..$ :'data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:int 1 2
#   .. .. .. ..$ z:logi-TRUE-FALSE
#   .. .. ..$ :'data.frame”:2个obs。共有3个变量:
#   .. .. .. ..$ x:chr“A”和“B”
#   .. .. .. ..$ y:INT1020
#   .. .. .. ..$ z:logi假-真
唯一有效的东西(不是我们想要的) 包装
tibble::as_ti
#> Load libraries ----
library(tidyverse)

json <- '[
  {
    "labels": ["label-a", "label-b"],
    "levelOne": {
      "levelTwo": {
        "levelThree": [
          {
            "x": "A",
            "y": 1,
            "z": true
          },
          {
            "x": "B",
            "y": 2,
            "z": false
          }
          ]
      }
    },
    "schema": "0.0.1"
  },
  {
    "labels": ["label-a", "label-b"],
    "levelOne": {
      "levelTwo": {
        "levelThree": [
          {
            "x": "A",
            "y": 10,
            "z": false
          },
          {
            "x": "B",
            "y": 20,
            "z": true
          }
          ]
      }
    },
    "schema": "0.0.1"
  }
]'  

# convert json to a nested data.frame
df <- jsonlite::fromJSON(json)
# define a simple function to convert data.frame to tibble
df_to_tibble <- function(x) {
  if (is.data.frame(x)) as_tibble(x) else x
}
# create df_tibble by reducing the result of applying df_to_tibble to each level
# of df via purrr's modify_depth function %>% lastly, ensure that the top level
# data.frame is also converted to a tibble
df_tibble <- purrr::reduce(
  0:purrr::vec_depth(df),
  function(x, depth) {
    purrr::modify_depth(x, depth, df_to_tibble, .ragged = TRUE)
  }, 
  .init = df
) %>% 
  as_tibble()
# show the structure of df_tibble
str(df_tibble)
#> Classes 'tbl_df', 'tbl' and 'data.frame':    2 obs. of  3 variables:
#>  $ labels  :List of 2
#>   ..$ : chr  "label-a" "label-b"
#>   ..$ : chr  "label-a" "label-b"
#>  $ levelOne:Classes 'tbl_df', 'tbl' and 'data.frame':    2 obs. of  1 variable:
#>   ..$ levelTwo:Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of  1 variable:
#>   .. ..$ levelThree:List of 2
#>   .. .. ..$ :Classes 'tbl_df', 'tbl' and 'data.frame':   2 obs. of  3 variables:
#>   .. .. .. ..$ x: chr  "A" "B"
#>   .. .. .. ..$ y: int  1 2
#>   .. .. .. ..$ z: logi  TRUE FALSE
#>   .. .. ..$ :Classes 'tbl_df', 'tbl' and 'data.frame':   2 obs. of  3 variables:
#>   .. .. .. ..$ x: chr  "A" "B"
#>   .. .. .. ..$ y: int  10 20
#>   .. .. .. ..$ z: logi  FALSE TRUE
#>  $ schema  : chr  "0.0.1" "0.0.1"