如何用dplyr或迭代法筛选数据集并重置ID?
问题解决:按条件删除行并重置ID
原始数据集
structure(list(ID = c(1, 2, 3, 4, 6, 7), V = c(0, 0, 1, 1, 1, 0), Mus = c(1, 0, 1, 1, 1, 0), R = c(1, 0, 1, 1, 1, 1), E = c(1, 0, 0, 1, 0, 0), S = c(1, 0, 1, 1, 1, 0), t = c(0, 0, 0, 1, 0, 0), score = c(1, 0.4, 1, 0.4, 0.4, 0.4)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"), na.action = structure(c(`5` = 5L, `12` = 12L, `15` = 15L, `21` = 21L, `22` = 22L, `23` = 23L, `34` = 34L, `44` = 44L, `46` = 46L, `52` = 52L, `56` = 56L, `57` = 57L, `58` = 58L ), class = "omit"))
需求说明
需要删除满足以下两个条件的行:
- 第二至第六列(
V、Mus、R、E、S)的值全为0 - 最后一列(
score)的值为0.4
删除后将ID重置为连续序号,预期结果如下:
# A tibble: 5 × 8 ID V Mus R E S t score <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 0 1 1 1 1 0 1 2 3 1 1 1 0 1 0 1 3 4 1 1 1 1 1 1 0.4 4 6 1 1 1 0 1 0 0.4 5 7 0 0 1 0 0 0 0.4
方法一:使用dplyr包(简洁高效)
dplyr是数据框处理的常用工具,代码可读性高,操作简洁:
library(dplyr) # 加载数据(假设数据框名为df) df <- structure(list(ID = c(1, 2, 3, 4, 6, 7), V = c(0, 0, 1, 1, 1, 0), Mus = c(1, 0, 1, 1, 1, 0), R = c(1, 0, 1, 1, 1, 1), E = c(1, 0, 0, 1, 0, 0), S = c(1, 0, 1, 1, 1, 0), t = c(0, 0, 0, 1, 0, 0), score = c(1, 0.4, 1, 0.4, 0.4, 0.4)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"), na.action = structure(c(`5` = 5L, `12` = 12L, `15` = 15L, `21` = 21L, `22` = 22L, `23` = 23L, `34` = 34L, `44` = 44L, `46` = 46L, `52` = 52L, `56` = 56L, `57` = 57L, `58` = 58L), class = "omit")) # 处理步骤 result_df <- df %>% # 过滤掉符合删除条件的行 filter(!(rowSums(select(., V:S) == 0) == 5 & score == 0.4)) %>% # 重置ID为连续序号 mutate(ID = row_number()) # 查看结果 print(result_df)
代码解释
select(., V:S):选取第二到第六列(列名范围从V到S)rowSums(select(., V:S) == 0) == 5:判断这5列是否全为0(全0时行和等于列数5)!(...):取反逻辑,保留不满足删除条件的行mutate(ID = row_number()):将ID替换为当前行的连续序号
方法二:使用基础R循环
如果不想依赖第三方包,可以用基础R的循环实现:
# 加载数据 df <- structure(list(ID = c(1, 2, 3, 4, 6, 7), V = c(0, 0, 1, 1, 1, 0), Mus = c(1, 0, 1, 1, 1, 0), R = c(1, 0, 1, 1, 1, 1), E = c(1, 0, 0, 1, 0, 0), S = c(1, 0, 1, 1, 1, 0), t = c(0, 0, 0, 1, 0, 0), score = c(1, 0.4, 1, 0.4, 0.4, 0.4)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"), na.action = structure(c(`5` = 5L, `12` = 12L, `15` = 15L, `21` = 21L, `22` = 22L, `23` = 23L, `34` = 34L, `44` = 44L, `46` = 46L, `52` = 52L, `56` = 56L, `57` = 57L, `58` = 58L), class = "omit")) # 初始化要保留的行索引 keep_rows <- c() # 循环遍历每一行 for (i in 1:nrow(df)) { # 检查第二到第六列是否全为0,且score=0.4 cols_to_check <- df[i, 2:6] all_zero <- all(cols_to_check == 0) score_match <- df[i, "score"] == 0.4 # 不满足删除条件则保留该行 if (!(all_zero && score_match)) { keep_rows <- c(keep_rows, i) } } # 筛选保留的行 result_df <- df[keep_rows, ] # 重置ID为连续序号 result_df$ID <- 1:nrow(result_df) # 查看结果 print(result_df)
代码解释
- 循环遍历每一行,逐一判断是否符合删除条件
- 将不需要删除的行索引存入
keep_rows,用该索引筛选数据框 - 最后把
ID列替换为1到总行数的连续值,完成重置
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

