如何将R语言dataframe的分类列拆分为多列并填充二进制值?
解决方法:把分类列拆分为多列的DataFrame重塑
原始数据
你的初始DataFrame定义如下:
df <- data.frame(animal = c("dog", "dog", "cat", "dog", "cat", "cat"), hunger = c(0, 1, 1, 0, 1,1))
方法1:用tidyverse(tidyr)实现(推荐)
这是通用型最强的方法,适合分类较多的场景,需要先安装并加载tidyr(或整个tidyverse包):
# 安装包(首次使用时执行) install.packages("tidyverse") library(tidyverse) # 给每个动物组添加组内行号,作为重塑的标识 df_with_row_id <- df %>% group_by(animal) %>% mutate(row_id = row_number()) %>% ungroup() # 转成宽格式 final_df <- df_with_row_id %>% pivot_wider(names_from = animal, # 用animal的取值作为新列名 values_from = hunger) # 用hunger的值填充对应单元格 %>% select(-row_id) # 移除临时的行号列
运行后得到的final_df就是你想要的结果:
> final_df # A tibble: 3 × 2 dog cat <dbl> <dbl> 1 0 1 2 1 1 3 0 1
方法2:Base R 直接拆分合并(适合分类少的情况)
如果你的分类只有dog和cat两种,直接拆分再合并更简单:
# 提取对应动物的hunger值 dog_vals <- df$hunger[df$animal == "dog"] cat_vals <- df$hunger[df$animal == "cat"] # 组合成新DataFrame final_df <- data.frame(dog = dog_vals, cat = cat_vals)
方法3:用data.table实现
如果习惯用data.table,可以这样做:
# 安装包(首次使用时执行) install.packages("data.table") library(data.table) # 转成data.table并添加组内行号 setDT(df)[, row_id := .I, by = animal] # 重塑为宽格式并移除行号 final_df <- dcast(df, row_id ~ animal, value.var = "hunger")[, row_id := NULL]
内容的提问来源于stack exchange,提问作者Icewaffle
相关产品推荐
相关产品推荐

