数据框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")
)
我曾尝试使用unnest
和unnest_wider
、flatten
和unlist
,但无济于事。
例如,如果我运行,
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】:我们可以使用reduce
和tibble
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】:
使用来自tidyr
的unpack
可以完成我认为的工作:
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中的未嵌套数据框的主要内容,如果未能解决你的问题,请参考以下文章