如何将tibble作为嵌套单元格赋值到现有tibble中?
如何将内部tibble赋值到外部tibble的单个单元格实现嵌套
问题描述
想要将一个tibble作为单元格值赋值到另一个tibble中,但直接赋值会导致子tibble被转换为其他格式,无法得到预期的嵌套tibble效果。
预期效果的示例代码:
library(dplyr) desired = tibble( row = 1:4, nested = list( tibble(text = c("a","b","c")), tibble(numbers = 1:4), tibble(label = c("high", "med", "low"), value = c(10, 5, 0)), NA ) )
但增量构建时出现问题:
library(dplyr) # 外部tibble df = tibble(row = 1:4) # 内部tibbles t1 = tibble(text = c("a","b","c")) t2 = tibble(numbers = 1:4) t3 = tibble(label = c("high", "med", "low"), value = c(10, 5, 0)) # 初始化嵌套列 df = df %>% mutate(nested = purrr::map(row, ~{ tibble() })) # 赋值失败 df$nested[1] = t1 # 无报错,但df$nested[1]变成字符类型而非tibble df$nested[2] = t2 # 无报错,但df$nested[2]变成整数类型而非tibble df$nested[3] = t3 # 出现警告,仅赋值t3的一列
收到的警告信息:
In df$nested[3] = t3 :
number of items to replace is not a multiple of replacement length
执行后的结果:
> df # A tibble: 4 x 2 row nested <int> <list> 1 1 <chr [3]> 2 2 <int [4]> 3 3 <chr [3]> 4 4 <tibble [0 × 0]>
解决方案
方法1:用列表包裹子tibble后赋值
直接赋值时,需要将子tibble放在单元素列表中,这样R会识别为要赋值整个列表元素(即子tibble),而不是拆解tibble的内容:
# 修正赋值语句 df$nested[1] = list(t1) df$nested[2] = list(t2) df$nested[3] = list(t3) df$nested[4] = list(NA) # 可选:设置第四行为NA # 查看结果 df
执行后得到预期的嵌套tibble:
> df # A tibble: 4 x 2 row nested <int> <list> 1 1 <tibble [3 × 1]> 2 2 <tibble [4 × 1]> 3 3 <tibble [3 × 2]> 4 4 <lgl [1]>
方法2:使用dplyr::mutate结合条件赋值
如果需要批量或按条件赋值,可以用mutate配合case_when,更符合tidyverse风格:
df = tibble(row = 1:4) %>% mutate( nested = case_when( row == 1 ~ list(t1), row == 2 ~ list(t2), row == 3 ~ list(t3), TRUE ~ list(NA) ) )
方法3:初始化时直接构建嵌套列
如果提前知道所有子tibble,也可以像示例代码一样直接在tibble()中定义嵌套列,一步到位:
df = tibble( row = 1:4, nested = list(t1, t2, t3, NA) )
内容的提问来源于stack exchange,提问作者Simon.S.A.
相关产品推荐
相关产品推荐

