如何用dplyr在R中多列统计多值生成0/1型计数变量
在R中用dplyr生成存在性标记变量(0/1)
解决方案
1. 加载包并准备数据
首先加载dplyr包,导入示例数据:
library(dplyr) # 示例数据 D <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), X1 = c(1, NA, NA, NA, NA, NA, 1, 1, 1, 1), X2 = c(2, 1, 1, 1, 1, NA, 2, NA, NA, 2), X3 = c(NA, NA, NA, NA, NA, 1, NA, NA, NA, NA), X4 = c(4, 2, NA, NA, NA, NA, 3, NA, 2, 3), X5 = c(5, NA, 2, 2, 2, NA, NA, NA, NA, NA)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L))
2. 生成S1-S4变量
使用mutate结合if_any函数,逐行检查X1-X5列中是否存在目标值,将逻辑结果转为0/1:
D <- D %>% mutate( # S1:X1-X5中是否存在1 S1 = as.integer(if_any(X1:X5, ~ .x == 1, na.rm = TRUE)), # S2:X1-X5中是否存在2 S2 = as.integer(if_any(X1:X5, ~ .x == 2, na.rm = TRUE)), # S3:X1-X5中是否存在3 S3 = as.integer(if_any(X1:X5, ~ .x == 3, na.rm = TRUE)), # S4:X1-X5中是否存在4 S4 = as.integer(if_any(X1:X5, ~ .x == 4, na.rm = TRUE)) )
if_any(X1:X5, ~ .x == 目标值):检查当前行的X1到X5列中,是否有任意一列等于目标值,na.rm = TRUE表示忽略NA值as.integer():将TRUE转为1,FALSE转为0
3. 查看结果
运行以下代码查看处理后的数据:
print(D)
输出示例:
# A tibble: 10 × 10 ID X1 X2 X3 X4 X5 S1 S2 S3 S4 <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <int> <int> <int> 1 1 1 2 NA 4 5 1 1 0 1 2 2 NA 1 NA 2 NA 1 1 0 0 3 3 NA 1 NA NA 2 1 1 0 0 4 4 NA 1 NA NA 2 1 1 0 0 5 5 NA 1 NA NA 2 1 1 0 0 6 6 NA NA 1 NA NA 1 0 0 0 7 7 1 2 NA 3 NA 1 1 1 0 8 8 1 NA NA NA NA 1 0 0 0 9 9 1 NA NA 2 NA 1 1 0 0 10 10 1 2 NA 3 NA 1 1 1 0
批量生成优化(可选)
如果需要生成更多类似变量,可以用across批量处理,避免重复代码:
# 定义目标值与对应变量名 targets <- setNames(c(1,2,3,4), paste0("S", c(1,2,3,4))) D <- D %>% mutate( across(all_of(names(targets)), ~ { val <- targets[cur_column()] as.integer(if_any(X1:X5, .x == val, na.rm = TRUE)) }) )
内容的提问来源于stack exchange,提问作者Reap409
相关产品推荐
相关产品推荐

