首页 > 解决方案 > 如果实例重复则变异

问题描述

我得到了一张(学校)表格,它是由关于学生、学校类型等的数据加上 x 和 y 坐标制成的。我想创建一个显示所有学校的地图。但是有些学校在同一个地址有两个或多个不同的学校类型。所以 x- 和 y- 是相同的,我不能在地图上同时显示,因为标记位于确切的位置。现在我想稍微改变多组坐标之一的 x 坐标 (X_CO)。

我的任务是找到一种方法来选择一对重复项的一个实例并改变行“X_CO”:

如果第一个(或最后一个)重复==TRUE 那么mutate(dat$X_CO=dat$X_CO+0.00015). 否则没有变化。这适用于表的每个实例。并重复两个以上具有相同坐标的实例的情况。

我试过duplicated(dat$X_CO)了,但这让我对 Name_B 和 Name_D 都是正确的。任何建议都会被赞赏:)

Data_have <- data.frame(
    Name = c("Name_A","Name_B","Name_C","Name_D"),
    X_CO = c(8.456,8.456,9.876,8.456)
)

Data_want <- data.frame(
    Name = c("Name_A","Name_B","Name_C","Name_D"),
    X_CO = c(8.456,8.457,9.876,8.458)
)

标签: rif-statementduplicatesdplyr

解决方案


如果你想改变最后一个副本,即c(1, 2, 3, 3, 3)成为c(1, 2, 3, 3.00015, 3.00030),那么(并稍微改变你的例子),

    Name  X_CO
1 Name_A 8.456
2 Name_B 8.456
3 Name_C 8.456
4 Name_D 8.456
5 Name_E 8.456
6 Name_F 9.876


i1 <- duplicated(have$X_CO)
vec_to_add <- 0.00015 * seq(sum(i1))

have$X_CO[i1] <- have$X_CO[i1] + vec_to_add

这使,

    Name    X_CO
1 Name_A 8.45600
2 Name_B 8.45615
3 Name_C 8.45630
4 Name_D 8.45645
5 Name_E 8.45660
6 Name_F 9.87600

根据您的评论,我们可以使用ave对所有连续重复项进行分组,即

have$new.X_CO <- have$X_CO + ave(have$X_CO, have$X_CO, FUN = function(i)0.00015 * (seq(length(i))-1))

这使,

    Name  X_CO new.X_CO
1 Name_A 8.456  8.45600
2 Name_B 8.456  8.45615
3 Name_C 8.456  8.45630
4 Name_D 8.456  8.45645
5 Name_E 8.456  8.45660
6 Name_F 9.876  9.87600
7 Name_G 7.000  7.00000
8 Name_H 7.000  7.00015
9 Name_I 7.000  7.00030

推荐阅读