r - 仅在 R 中行索引的特定范围内删除列中的重复值

标签 r dataframe duplicates

我有一个测试数据帧 df,我想从中删除 Hits 列中的重复值,但不删除与重复值关联的行。然而,条件是删除只能在行索引的某些特定范围内进行。

df <- data.frame(
  Hits = c("#a", "#ID:987129470", "#b", "Hit1", "Hit1", "Hit2", "Hit3", "Hit3", "#a", "#ID:6971324987", "#b", "Hit1", "Hit2", "Hit2", "Hit3"),
  Category1 = c(NA, NA, NA, 0.001, 0.001, 0.002, 0.003, 0.003, NA, NA, NA, 0.023, 0.341, 0.341, 0.569),
  Category2 = c(NA, NA, NA, 100, 100, 99, 98, 98, NA, NA, NA, 100, 95, 95, 97),
  Category3 = c(NA, NA, NA, 100, 100, 99, 98, 98, NA, NA, NA, 98, 97, 97, 92))

df 看起来像这样

enter image description here

在这种情况下,要执行删除操作的行索引范围是4:812:15。基本上,每个 ID 下的重复命中将被删除,保持其他列中的关联值不变。输出应该看起来像这样

enter image description here

在原始数据帧(大约有 100k 行!)中,无法指定范围。我该如何解决这个问题?

最佳答案

首先以#a开头进行分组 然后使用 ifelse 语句。

library(dplyr)
df %>% 
  group_by(id_Group = cumsum(Hits=="#a")) %>% 
  mutate(Hits = ifelse(duplicated(Hits), "", Hits)) %>% 
  ungroup() %>% 
  select(-id_Group)
  Hits             Category1 Category2 Category3
   <chr>                <dbl>     <dbl>     <dbl>
 1 "#a"                NA            NA        NA
 2 "#ID:987129470"     NA            NA        NA
 3 "#b"                NA            NA        NA
 4 "Hit1"               0.001       100       100
 5 ""                   0.001       100       100
 6 "Hit2"               0.002        99        99
 7 "Hit3"               0.003        98        98
 8 ""                   0.003        98        98
 9 "#a"                NA            NA        NA
10 "#ID:6971324987"    NA            NA        NA
11 "#b"                NA            NA        NA
12 "Hit1"               0.023       100        98
13 "Hit2"               0.341        95        97
14 ""                   0.341        95        97
15 "Hit3"               0.569        97        92

关于r - 仅在 R 中行索引的特定范围内删除列中的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70564446/

相关文章:

r - 如何有效地进行字符串的成对替换

python - Pandas - 搜索 DataFrame 单元格内的字符串

postgresql - 左连接后重复行

python - 根据另一列删除列中的重复单词

r - 脉冲响应函数

r - 如何从数据框中的列名中删除 '.'?

如果条件删除列名称中的字符串

r - 使用 if 将重复行压缩为唯一行

用组内其他列的第一个或最后一个值替换数据帧中的 NA 值

c# - 不使用 LINQ 从数据表中删除重复的列值