You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:07:04