【问题标题】:Mutate If Instance duplicate如果实例重复则变异
【发布时间】:2019-11-11 08:00:09
【问题描述】:

我有一张(学校)表格,它是由关于学生、学校类型等的数据加上 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)
)

【问题讨论】:

  • 您分享的示例中没有重复项。 Name_B 的号码有何变化?
  • “重复”在“X_CO”列中。它不是完整的行。改变是我想要的。
  • 那么have$X_CO[duplicated(have$X_CO)] &lt;- have$X_CO[duplicated(have$X_CO)] + 0.00015?
  • 是的,但 duplicated(have$X_CO) 给了我 TRUE Name_A 和 Name_B。
  • 不它应该只为第二个名字给出 TRUE...我得到duplicated(have$X_CO) [1] FALSE TRUE FALSE。我添加了一个答案。看看

标签: r if-statement duplicates dplyr


【解决方案1】:

如果您想更改最后一个副本,即 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

【讨论】:

  • 非常好!谢谢你。剩下一个问题:我得到了 1325 个重复项。所以正如我所看到的, seq(sum(i1)) 给我最后一个条目的数字非常高或第一个条目的数字非常低。如果它可以从每组重复项开始计数。这样就彻底解决了。我不知道如何告诉 R 重新开始计数。
  • @JulianSchulz 请立即查看。如果您满意,请接受(复选标记),以便我们考虑关闭
  • 在看到@Sotos 最新答案之前,我已经删除了一条评论。
猜你喜欢
  • 1970-01-01
  • 2013-05-23
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2011-10-26
相关资源
最近更新 更多