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

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

需求说明

需要删除满足以下两个条件的行:

  1. 第二至第六列(V、Mus、R、E、S)的值全为0
  2. 最后一列(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:25:57