如何使用R从含hosp、pid、treatment列的数据集生成0-1矩阵
没问题!我来教你怎么用R实现这个0-1矩阵的生成,先从构造示例数据集开始,再给你两种实用的实现方法:
第一步:构造示例数据集
先模拟一个符合你需求的数据集,方便后续演示:
df <- data.frame( hosp = c("A", "A", "B", "B", "C", "C", "A", "B", "C"), pid = c(1,2,3,4,5,6,7,8,9), treatment = c(1,0,1,1,0,1,0,0,1) )
方法1:tidyverse风格(tidyr + dplyr)
这种方法代码更简洁易读,适合熟悉tidyverse工具链的用户:
library(tidyr) library(dplyr) # 生成目标矩阵 result_matrix <- df %>% # 将hosp的每个唯一值转为列,对应值取treatment,缺失值填0 pivot_wider(names_from = hosp, values_from = treatment, values_fill = 0) %>% # 移除pid列(矩阵不需要患者ID) select(-pid) %>% # 转换为矩阵格式 as.matrix() # 查看结果 print(result_matrix)
运行后你会得到一个9行3列的矩阵,每个位置的0/1完全对应该观测在对应医院的treatment值。
方法2:基础R实现
如果你不想加载额外包,用基础R也能轻松实现:
# 获取所有唯一的医院名称 unique_hosps <- unique(df$hosp) # 遍历每个医院,生成对应列的0-1值 result_matrix_base <- sapply(unique_hosps, function(hospital) { # 当观测的hosp等于当前医院时取treatment,否则填0 ifelse(df$hosp == hospital, df$treatment, 0) }) # 给矩阵列命名(对应医院名称) colnames(result_matrix_base) <- unique_hosps # 查看结果 print(result_matrix_base)
两种方法得到的结果完全一致,你可以根据自己的习惯选择使用~
内容的提问来源于stack exchange,提问作者T Richard
相关产品推荐
相关产品推荐

