如何避免重复代码,从DataFrame按类别生成多个向量?
按DataFrame的类别批量生成Item向量
问题背景
现有如下结构的DataFrame:
Item Category [1] Apple Fruit [2] Onion Vegetable [3] Potato Vegetable [4] Grapes Fruit [5] Cabbage Vegetable [6] Orange Fruit [7] Peach Fruit
需要按Category分组,生成对应类别的Item向量,期望结果如下:
Fruit [1] "Apple" "Grapes" "Orange" "Peach" Vegetable [1] "Onion" "Potato" "Cabbage"
原有的实现方式是针对每个类别单独筛选转换,代码如下:
Vegie <- df %>% filter(Category == "Vegetable") Vegie <- as.vector(Vegie$Item)
但实际场景中有17个类别,重复操作效率低且代码冗余,需要更简洁的实现方式。
解决方案
方法1:基础R的split()函数(最简洁)
一行代码即可按类别拆分出所有向量,返回一个命名列表,列表每个元素对应类别的Item向量:
item_vectors <- split(df$Item, df$Category)
调用item_vectors$Fruit可直接获取水果类向量,item_vectors$Vegetable获取蔬菜类向量,所有类别会自动生成对应元素。
方法2:tidyverse风格实现(dplyr + purrr)
若习惯使用tidyverse工具链,可按以下步骤实现:
library(dplyr) library(purrr) item_vectors <- df %>% group_split(Category, .keep = FALSE) %>% set_names(unique(df$Category)) %>% map(unlist)
group_split():按类别拆分出每个组的DataFrameset_names():给列表设置对应类别的名称map(unlist):将每个组的DataFrame转换为向量
结果验证
运行上述任意方法后,输入item_vectors即可查看所有类别的向量:
> item_vectors $Fruit [1] "Apple" "Grapes" "Orange" "Peach" $Vegetable [1] "Onion" "Potato" "Cabbage"
内容的提问来源于stack exchange,提问作者Samarth
相关产品推荐
相关产品推荐

