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中可以有classdata.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"