R语言多列条件处理:为q1-q4生成对应衍生列
R语言生成多列条件衍生变量解决方案
原始数据集
data <- data.frame(id=c(1,2,3,4,5,6,7), q1=c(3,4,5,2,1,2,4), q2=c(3,4,4,5,4,3,2), q3=c(2,3,2,3,1,2,3), q4=c(3,4,4,4,4,5,5))
需求说明
为q1至q4的每一列生成对应衍生列:
- 若原q列值为1,则对应
q_x=1列保留该值,其余情况为NA - 若原q列值为2,则对应
q_x=2列保留该值,其余情况为NA - 以此类推至值为5时,对应
q_x=5列保留该值,其余情况为NA - 最终输出需包含所有原始列和衍生列
解决方案(无需手动编写复杂循环)
方法1:使用tidyverse工具链(代码简洁直观)
先安装并加载依赖包:
install.packages("tidyverse") library(tidyverse)
执行转换代码:
result <- data %>% # 把所有q列转成长格式 pivot_longer(cols = starts_with("q"), names_to = "q_col", values_to = "q_val") %>% # 生成衍生列名和对应值 mutate( derived_col = paste0(q_col, "_", q_val), derived_val = q_val ) %>% # 转回宽格式生成所有衍生列 pivot_wider( id_cols = id, names_from = c(q_col, q_val), values_from = derived_val, names_sep = "_" ) %>% # 合并原始数据并调整列顺序 left_join(data, by = "id") %>% select(id, starts_with("q"), everything())
方法2:使用Base R(无需额外安装包)
# 筛选出所有q开头的列名 q_cols <- grep("^q\\d", colnames(data), value = TRUE) # 自动生成所有衍生列 for (col in q_cols) { for (val in 1:5) { new_col_name <- paste0(col, "_", val) data[[new_col_name]] <- ifelse(data[[col]] == val, val, NA) } }
注:这里的循环是自动化的,你只需复制运行即可,不需要手动修改每一列的逻辑。
输出验证
执行上述任意方法后,查看结果即可得到符合要求的数据集,示例输出片段:
id q1 q2 q3 q4 q1_1 q1_2 q1_3 q1_4 q1_5 1 1 3 3 2 3 NA NA 3 NA NA 2 2 4 4 3 4 NA NA NA 4 NA 3 3 5 4 2 4 NA NA NA NA 5 4 4 2 5 3 4 NA 2 NA NA NA 5 5 1 4 1 4 1 NA NA NA NA 6 6 2 3 2 5 NA 2 NA NA NA 7 7 4 2 3 5 NA NA NA 4 NA
内容的提问来源于stack exchange,提问作者T K
相关产品推荐
相关产品推荐

