如何读取下一行值是否重复,如果重复则根据组从1开始排序

问题描述 投票:0回答:2

我有一个复杂的场景,如果下一组的记录重复,我必须开始对数字进行排名,然后按照 1、2 3 的顺序进行排序,如果有新值,则停止编号。

请查看以下场景,任何 R 或 Spotfire 中的帮助将不胜感激。

在附图中,值 70 在测试 id-10、11、12 和 13 中重复,因此数字应为 1、2、3 和 4,但 77 在测试 id 10 中重复,并跳过 11 并再次开始 12 13 所期望的结果应该是 1,1 和 2

我已经厌倦了在Spotfire中使用Rank Baserowid,但在第二种情况下我无法得到它。

r spotfire
2个回答
2
投票

我认为您共享的图像中的数据集与解释您想要执行的操作的文本并不 100% 一致。例如,值 77 在测试 ID 组 13 中不会重复。

但是,使用

dplyr
包,我认为以下工作流程可以解决您的问题。

#create sample data 
data <- data.frame(
  Group = c("52", "52", "52", "52", "52", "52","52", "52", "52", "52", "52"),
  Subgroup = c("BD", "BD", "BD", "BD", "BD", "BD","BD", "BD", "BD", "BD", "BD"),
  Test.ID = c(10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14),
  Value = c(70, 65, 77, 70, 73, 91, 77, 70, 70,70, 77)
)

#load package 
library(dplyr)

#add column 

data <- data %>%
  group_by(Value) %>%
  mutate(
    result = if_else(
      c(FALSE, diff(Test.ID) != 1), 1, row_number()
    )
  ) %>%
  ungroup()

结果

   Group Subgroup Test.ID Value result
   <chr> <chr>      <dbl> <dbl>  <dbl>
 1 52    BD            10    70      1
 2 52    BD            10    65      1
 3 52    BD            10    77      1
 4 52    BD            11    70      2
 5 52    BD            11    73      1
 6 52    BD            11    91      1
 7 52    BD            12    77      1
 8 52    BD            12    70      3
 9 52    BD            13    70      4
10 52    BD            13    70      1
11 52    BD            14    77      1

希望这有帮助!


0
投票

数据来自Flap的回答
这是带有

ave
的基本 R 解决方案。

我的第一次尝试是按

Group, Subgroup, Value
分组并应用
seq_along
来获得连续的数字,但是当
Test.ID
等于13时出现问题,有两个
Value
的70并且数字也变得连续,4和5,而不是两个 4。请参阅下面第 9 行和第 10 行。

data <- data.frame(
  Group = c("52", "52", "52", "52", "52", "52","52", "52", "52", "52", "52"),
  Subgroup = c("BD", "BD", "BD", "BD", "BD", "BD","BD", "BD", "BD", "BD", "BD"),
  Test.ID = c(10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14),
  Value = c(70, 65, 77, 70, 73, 91, 77, 70, 70,70, 77)
)

cbind(
  data,
  result = with(data, ave(Value, Group, Subgroup, Value, FUN = seq_along))
)
#>    Group Subgroup Test.ID Value result
#> 1     52       BD      10    70      1
#> 2     52       BD      10    65      1
#> 3     52       BD      10    77      1
#> 4     52       BD      11    70      2
#> 5     52       BD      11    73      1
#> 6     52       BD      11    91      1
#> 7     52       BD      12    77      2
#> 8     52       BD      12    70      3
#> 9     52       BD      13    70      4
#> 10    52       BD      13    70      5
#> 11    52       BD      14    77      3

创建于 2024-04-12,使用 reprex v2.1.0

因此,首先创建一个具有唯一行的临时数据集,然后应用上面的逻辑,然后与原始数据集合并。

udata <- data |> unique()
udata$result <- udata |>
  with(ave(Value, Group, Subgroup, Value, FUN = seq_along))
data <- merge(data, udata)
data
#>    Group Subgroup Test.ID Value result
#> 1     52       BD      10    65      1
#> 2     52       BD      10    70      1
#> 3     52       BD      10    77      1
#> 4     52       BD      11    70      2
#> 5     52       BD      11    73      1
#> 6     52       BD      11    91      1
#> 7     52       BD      12    70      3
#> 8     52       BD      12    77      2
#> 9     52       BD      13    70      4
#> 10    52       BD      13    70      4
#> 11    52       BD      14    77      3

# final clean up
rm(udata)

创建于 2024-04-12,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.