要删除我可以使用的数据框:
df <- data_frame(
x = 1,
y = list(a = 1, b = 2)
)
tidyr::unnest(df)
但是如何在数据框列内的列表中删除列表呢?
df <- data_frame(
x = 1,
y = list(list(a = 1, b = 2))
)
tidyr::unnest(df)
错误:
每列必须是向量列表或数据帧列表[y]
答案 0 :(得分:15)
使用purrr
,这对列表很有用,
library(purrr)
df %>% dmap(unlist)
## # A tibble: 2 x 2
## x y
## <dbl> <dbl>
## 1 1 1
## 2 1 2
或多或少等同于
as.data.frame(lapply(df, unlist))
## x y
## a 1 1
## b 1 2
更新
dmap
已被弃用并移至purrrlyr,这是有趣但功能不完善的功能之家,现在会向您发出大量弃用警告。您可以将基本R惯用语翻译为tidyverse:
df %>% map(unlist) %>% as_data_frame()
这适用于这种情况,但不适用于多行(这些方法面临的问题)。一个更强大的解决方案可能是
library(tidyverse)
df %>% bind_rows(df) %>% # make larger sample data
mutate_if(is.list, simplify_all) %>% # flatten each list element internally
unnest() # expand
#> # A tibble: 4 × 2
#> x y
#> <dbl> <dbl>
#> 1 1 1
#> 2 1 2
#> 3 1 1
#> 4 1 2
答案 1 :(得分:3)
由于 tidyr 1.0.0 :
,可以使用unnest_longer()
在一个简单的步骤中完成此操作
df <- tibble::tibble(
x = 1,
y = list(list(a = 1, b = 2))
)
library(tidyr)
unnest_longer(df,y,indices_include = FALSE)
#> # A tibble: 2 x 2
#> x y
#> <dbl> <dbl>
#> 1 1 1
#> 2 1 2
由reprex package(v0.3.0)于2019-09-14创建