在R中将行转换为字符串:为重复行分配相同标识的实现方法
在R中实现观测值的字符串编码与重复值分组赋值
需求说明
将包含6个整数型变量的10000条观测数据,每行编码为一个由变量值组成的字符串;重复的字符串对应的观测行,分配相同的分组标识值。
示例数据
首先加载示例数据(已修正原代码的引号格式):
set.seed(1) dat <- data.frame( matrix( sample(1:3, 5*12, replace=TRUE), 12, 5, dimnames=list(1:12, c("X1","X2","X3","X4","X5")) ), Sex=rep(c("Male", "Female")) )
示例数据包含5个整数变量X1-X5和1个分类变量Sex,先将Sex转换为整数型(符合需求中的整数型变量要求):
# 将Sex转换为整数:Male=1,Female=2 dat$Sex_num <- ifelse(dat$Sex == "Male", 1, 2)
方法一:Base R实现
1. 生成每行的编码字符串
使用apply函数将指定的6个整数变量按行拼接为字符串,用下划线分隔:
# 选择X1-X5和Sex_num共6个变量,拼接为编码字符串 dat$code_str <- apply(dat[, c(paste0("X", 1:5), "Sex_num")], 1, paste, collapse = "_")
2. 为重复字符串分配唯一分组值
通过factor将字符串转换为因子,再转为整数即可得到重复字符串对应的相同标识:
# 生成分组标识,重复的code_str对应相同的group_id dat$group_id <- as.integer(factor(dat$code_str))
方法二:Tidyverse实现
使用dplyr和tidyr包完成操作,代码更简洁直观:
library(dplyr) library(tidyr) dat <- dat %>% # 将Sex转换为整数 mutate(Sex_num = ifelse(Sex == "Male", 1, 2)) %>% # 将6个变量拼接为编码字符串(remove=FALSE保留原变量) unite(code_str, X1:X5, Sex_num, sep = "_", remove = FALSE) %>% # 根据编码字符串生成分组标识 mutate(group_id = group_indices(., code_str))
验证结果
查看数据可以看到,编码字符串相同的行,分组标识group_id完全一致:
# 查看部分结果 dat[, c("code_str", "group_id")]
内容的提问来源于stack exchange,提问作者EB3112
相关产品推荐
相关产品推荐

