R语言字符型数据的长格式处理、去重、赋值求和需求
R语言数据处理实现方案
先加载所需工具包:
library(tidyverse)
原始数据结构:
d <- structure(list(id = c(101, 101, 101, 101, 102, 102, 102, 103, 103, 103, 103, 104), m = c("15 ag", "15 ag", NA, "12 cer", NA, "18 di", "12 cer", "11 dem", "11 dem", NA, "12 cer", "25 dia" )), class = c("tbl_df", "tbl", "data.frame"),row.names =c(NA,-12L))
完整处理代码
result <- d %>% # 步骤1:数据已是长格式,直接过滤无效的NA值 filter(!is.na(m)) %>% # 步骤2:按id和m去重,每个id的m值仅保留一条记录 distinct(id, m, .keep_all = TRUE) %>% # 步骤3:为m列字符值匹配对应分数 mutate(score = case_when( m == "15 ag" ~ 0, m == "12 cer" ~ 1, m == "18 di" ~ 6, m == "11 dem" ~ 2, m == "25 dia" ~ 0 )) %>% # 步骤4:按id分组计算分数总和 group_by(id) %>% summarise(sum_score = sum(score, na.rm = TRUE)) %>% ungroup() # 查看最终结果 result
代码说明
- 步骤1:原始数据本身就是长格式(每个id对应多行m记录),因此直接过滤
m列的NA值(这类值无对应分数,无需保留)。 - 步骤2:通过
distinct()按id和m去重,确保每个id的每个有效m值仅保留一条记录。 - 步骤3:用
case_when()实现规则匹配,为每个m值分配对应分数,逻辑直观易修改。 - 步骤4:按
id分组后,用sum()计算分数总和,na.rm = TRUE避免因意外未匹配值导致总和出错。
运行结果
# A tibble: 4 × 2 id sum_score <dbl> <dbl> 1 101 1 2 102 7 3 103 3 4 104 0
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

