将重复项替换为最后一位[R]中相差n+1的值



我想知道df中的某一列(spec(是否包含重复项,如果包含,则替换它们的值,因此重复项的n+1次出现的最后一位数字将比原始值大1。

下面是一个伪示例:

sens <- c(1.0000000, 0.9968220, 0.1302966,0.1197034, 0.0000000)
spec <- c(0.0000000, 0.9978812, 0.9978812,0.9978812, 1.0000000)
df <- data.frame(sens, spec)

这是我想要的输出:

sens <- c(1.0000000, 0.9968220, 0.1302966,0.1197034, 0.0000000)
spec <- c(0.0000000, 0.9978812, 0.9978813,0.9978814, 1.0000000)
out <- data.frame(sens, spec)

尝试过这个,但它没有产生我想要的输出:

df2 <- within(df, spec <- ifelse(duplicated(spec), spec+0.0000001, spec))

非常感谢您的帮助。对不起我的英语,我尽力解释了。

我们可以使用每组cumsum

library(dplyr)
df |>
group_by(spec) |>
mutate(new_spec = spec+cumsum(duplicated(spec))*0.0000001) |>
ungroup()

输出:

sens      spec  new_spec
1 1.0000000 0.0000000 0.0000000
2 0.9968220 0.9978812 0.9978812
3 0.1302966 0.9978812 0.9978813
4 0.1197034 0.9978812 0.9978814
5 0.0000000 1.0000000 1.0000000

使用data.table

library(data.table)
setDT(df)[, spec2 := spec + ((seq_len(.N)-1) * 0.0000001), spec]

-输出

> df
sens      spec     spec2
<num>     <num>     <num>
1: 1.0000000 0.0000000 0.0000000
2: 0.9968220 0.9978812 0.9978812
3: 0.1302966 0.9978812 0.9978813
4: 0.1197034 0.9978812 0.9978814
5: 0.0000000 1.0000000 1.0000000

最新更新