数据框R中的未嵌套数据框

Posted

技术标签:

【中文标题】数据框R中的未嵌套数据框【英文标题】:unnest dataframe within dataframe R 【发布时间】:2020-06-10 21:36:15 【问题描述】:

我想取消嵌套这个数据框。

df <- tibble(
  bears = c(1,2,3),
  eagles = tibble(
    talons = c(2,3,4),
    beaks = c("x","y","z")
  )
)

所以看起来像

tibble(
  bears = c(1,2,3),
  talons = c(2,3,4),
   beaks = c("x","y","z")
)

我曾尝试使用unnestunnest_widerflattenunlist,但无济于事。 例如,如果我运行,

test <- df %>%
  unnest_wider(eagles, names_sep = "_")

错误是

Error: Assigned data `map(data[[col]], vec_to_wide, col = col, names_sep = names_sep)` must be compatible with existing data.
x Existing data has 3 rows.
x Assigned data has 2 rows.
ℹ Only vectors of size 1 are recycled.

我不确定如何解决此错误。谢谢!

【问题讨论】:

【参考方案1】:

我们可以使用reducetibble

library(purrr)
df1 <- bind_cols(df[1], reduce(df[-1], tibble))
str(df1)
#tibble [3 × 3] (S3: tbl_df/tbl/data.frame)
# $ bears : num [1:3] 1 2 3
# $ talons: num [1:3] 2 3 4
# $ beaks : chr [1:3] "x" "y" "z"

或者如果我们需要重命名

library(dplyr)
library(stringr)
df %>%
    select(where(is.tibble)) %>%
    imap_dfc(~  set_names(.x, str_c(.y, '_', names(.x)))) %>%
    bind_cols(df %>%
          select(where(negate(is.tibble))), .)
# A tibble: 3 x 3
#  bears eagles_talons eagles_beaks
#  <dbl>         <dbl> <chr>       
#1     1             2 x           
#2     2             3 y           
#3     3             4 z           

或者使用

df %>%
  reduce(data.frame) 

或者更简单的选择是do.call in base R

df1 <- do.call(data.frame, df)
str(df1)
#'data.frame':  3 obs. of  3 variables:
# $ bears        : num  1 2 3
# $ eagles.talons: num  2 3 4
# $ eagles.beaks : chr  "x" "y" "z"

【讨论】:

谢谢!这行得通。有没有办法将变量命名为 eagles_talons within reduce 函数? @Nick 我不确定您是否只需要 tidverse 方法,使用 do.call 更新的列给出了以 'eagles' 作为前缀的列 @Nick 我更新了帖子。请检查是否有帮助【参考方案2】:

使用来自tidyrunpack 可以完成我认为的工作:

df <- tibble(
         bears = c(1,2,3),
         eagles = tibble(
             talons = c(2,3,4),
             beaks = c("x","y","z")
         )
    )
tidyr::unpack(df, cols=c(eagles))

输出:

# A tibble: 3 x 3
  bears talons beaks
  <dbl>  <dbl> <chr>
1     1      2 x    
2     2      3 y    
3     3      4 z  

如果你想保持“老鹰”,那么做

 unpack(df, cols=c(eagles), names_sep = "_")

【讨论】:

【参考方案3】:

另一种解决方案可能会帮助那些想弄清楚为什么取消嵌套不起作用的人:unnest() 适用于 list-数据框列。因此,如果将原来的 df 更改为包含一个列表列,那么一切都会按照 OP 的预期工作。

df <- tibble(
  bears = c(1,2,3),
  eagles = list(tibble(
    talons = c(2,3,4),
    beaks = c("x","y","z")
  ))
)

unnest(df, eagles)

【讨论】:

以上是关于数据框R中的未嵌套数据框的主要内容,如果未能解决你的问题,请参考以下文章

R中数据框中的嵌套子集

如何将嵌套的 txt/json 转换为 R 中的“正确”数据框

MS-Access 中的未嵌套行?

如何使用嵌套字典列表展平熊猫数据框中的列

Python中将列表元素嵌套到数据框

如何在 R 数据框中取消嵌套列表,同时保留键和值?