我想知道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