如何用tidyr::unnest()展开嵌套tibble得到指定结构的数据表
展开嵌套tibble的解决方案
现有如下嵌套结构的tibble对象test:
test # A tibble: 2 × 4 site data samp dates <chr> <list> <int> <list> 1 ARK <tibble [15 × 2]> 15 <date [15]> 2 BCH <tibble [44 × 2]> 44 <date [44]>
其构造代码为:
test <- structure(list(site = c("ARK", "BCH"), data = list(structure(list( alcohol = c("Yes", "No", "Yes", "No", "No", "No", "Yes", "No", "No", "No", "No", "No", "No", "No", "No"), opioids = c("No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No")), row.names = c(NA, -15L), class = c("tbl_df", "tbl", "data.frame")), structure(list(alcohol = c("No", "No", "No", "Yes", "No", "No", "No", "Yes", "No", "No", "No", "No", "No", "No", "No", "No", "Yes", "No", "Yes", "Yes", "No", "Yes", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "Yes", "No", "No", "Yes", "No", "Yes", "Yes", NA), opioids = c("No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", NA)), row.names = c(NA, -44L), class = c("tbl_df", "tbl", "data.frame"))), samp = c(15L, 44L), dates = list(structure(c(19786, 19854.0714285714, 19922.1428571429, 19990.2142857143, 20058.2857142857, 20126.3571428571, 20194.4285714286, 20262.5, 20330.5714285714, 20398.6428571429, 20466.7142857143, 20534.7857142857, 20602.8571428571, 20670.9285714286, 20739), class = "Date"), structure(c(19786, 19808.1627906977, 19830.3255813953, 19852.488372093, 19874.6511627907, 19896.8139534884, 19918.976744186, 19941.1395348837, 19963.3023255814, 19985.4651162791, 20007.6279069767, 20029.7906976744, 20051.9534883721, 20074.1162790698, 20096.2790697674, 20118.4418604651, 20140.6046511628, 20162.7674418605, 20184.9302325581, 20207.0930232558, 20229.2558139535, 20251.4186046512, 20273.5813953488, 20295.7441860465, 20317.9069767442, 20340.0697674419, 20362.2325581395, 20384.3953488372, 20406.5581395349, 20428.7209302326, 20450.8837209302, 20473.0465116279, 20495.2093023256, 20517.3720930233, 20539.5348837209, 20561.6976744186, 20583.8604651163, 20606.023255814, 20628.1860465116, 20650.3488372093, 20672.511627907, 20694.6744186047, 20716.8372093023, 20739), class = "Date"))), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"))
需要将其展开为包含15+44=59行、5列的tibble,列分别为site、alcohol(取自data)、opioids(取自data)、samp和dates。
解决代码
使用tidyr::unnest()函数,同时指定需要展开的嵌套列data和dates:
library(tidyr) # 展开嵌套列 result <- test %>% unnest(cols = c(data, dates)) # 查看结果结构 str(result)
验证结果
执行后得到的tibble结构如下:
result # A tibble: 59 × 5 site alcohol opioids samp dates <chr> <chr> <chr> <int> <date> 1 ARK Yes No 15 2024-01-01 2 ARK No No 15 2024-03-10 3 ARK Yes No 15 2024-05-18 4 ARK No No 15 2024-07-27 5 ARK No No 15 2024-09-14 6 ARK No No 15 2024-11-22 7 ARK Yes No 15 2025-01-30 8 ARK No No 15 2025-04-09 9 ARK No No 15 2025-06-17 10 ARK No No 15 2025-08-25 # ℹ 49 more rows
可以看到,结果已成功展开为59行5列,包含所需的所有字段。
内容的提问来源于stack exchange,提问作者tic-toc-choc
相关产品推荐
相关产品推荐

