如何移除data.frame转tibble后列内列表元素的名称?
移除tibble中列表列的元素名称,转为常规数值列
问题背景
使用命名向量创建data.frame后转换为tibble,原本的列变为命名列表类型,需要移除这些列表元素的名称,将其转为常规数值列,且不修改原始data.frame。
示例数据
ww = structure(list(is_character = list(`labA` = 1, `labB` = 1, `labC` = 1), is_numeric = list(`labA` = 0, `labB` = 0, `labC` = 0), is_logical = list(`labA` = 0, `labB` = 0, `labC` = 0), column_name = c("labA", "labB", "labC")), row.names = c(NA, -3L), class = "data.frame")
现象说明
- 以
data.frame形式查看时显示正常:
is_character is_numeric is_logical column_name 1 1 0 0 labA 2 1 0 0 labB 3 1 0 0 labC
- 转换为
tibble后,列变为命名列表:
# A tibble: 3 x 4 is_character is_numeric is_logical column_name <named list> <named list> <named list> <chr> 1 <dbl [1]> <dbl [1]> <dbl [1]> labA 2 <dbl [1]> <dbl [1]> <dbl [1]> labB 3 <dbl [1]> <dbl [1]> <dbl [1]> labC
解决方案
可以结合dplyr和purrr工具包,对目标列批量处理,移除列表元素名称并转为数值类型:
方法1:指定目标列处理
针对已知的列表列,精准处理:
library(dplyr) library(purrr) ww_tibble <- as_tibble(ww) %>% mutate(across(c(is_character, is_numeric, is_logical), ~ map_dbl(.x, unname)))
方法2:自动识别所有列表列处理
如果不确定哪些列是列表类型,用where(is.list)自动筛选:
ww_tibble <- as_tibble(ww) %>% mutate(across(where(is.list), ~ map_dbl(.x, unname)))
处理后的结果:
# A tibble: 3 x 4 is_character is_numeric is_logical column_name <dbl> <dbl> <dbl> <chr> 1 1 0 0 labA 2 1 0 0 labB 3 1 0 0 labC
内容的提问来源于stack exchange,提问作者Simon.S.A.
相关产品推荐
相关产品推荐

