如何将二项分布数据重塑为长格式伯努利数据适配rpart分类树?
嘿,刚好我也常处理这种数据格式转换的需求,给你两种靠谱的方法,都能把你的宽格式数据转成rpart需要的长格式:
方法一:用tidyverse工具链(推荐,代码更简洁)
tidyverse里的tidyr和dplyr组合是处理这类格式转换的利器,步骤很清晰:
首先先构造你的示例数据(方便测试):
library(tidyverse) # 模拟你的原始宽格式数据 df <- tibble( Category = c("A", "B"), Shape = c("Square", "Triangle"), Color = c("Blue", "Blue"), Yes = c(3, 2), No = c(2, 4) )
然后执行格式转换:
long_df <- df %>% # 把Yes/No列转成"Result"列,同时保留计数 pivot_longer(cols = c(Yes, No), names_to = "Result", values_to = "Count") %>% # 根据计数重复行,实现展开 uncount(Count) %>% # 把Category重命名为你需要的ID rename(ID = Category)
转换完成后,long_df就是你想要的长格式啦,直接用来喂给rpart就行。
方法二:用Base R(无需额外安装包)
如果不想加载第三方包,用Base R也能实现:
先构造示例数据:
# 模拟原始宽格式数据 df <- data.frame( Category = c("A", "B"), Shape = c("Square", "Triangle"), Color = c("Blue", "Blue"), Yes = c(3, 2), No = c(2, 4), stringsAsFactors = FALSE )
然后执行转换:
# 遍历每一行,生成对应的展开数据 result_list <- lapply(1:nrow(df), function(row_idx) { current_row <- df[row_idx, ] # 生成Yes和No对应的重复行 yes_rows <- data.frame( ID = current_row$Category, Shape = current_row$Shape, Color = current_row$Color, Result = rep("Yes", current_row$Yes), stringsAsFactors = FALSE ) no_rows <- data.frame( ID = current_row$Category, Shape = current_row$Shape, Color = current_row$Color, Result = rep("No", current_row$No), stringsAsFactors = FALSE ) # 合并当前行的Yes和No数据 rbind(yes_rows, no_rows) }) # 把所有行的结果合并成最终数据框 long_df <- do.call(rbind, result_list)
两种方法最终得到的long_df结构完全一致,之后你就可以用类似rpart(Result ~ Shape + Color, data = long_df)的代码来构建分类树了。
内容的提问来源于stack exchange,提问作者As3adTintin
相关产品推荐
相关产品推荐

