【问题标题】:Special grouping number for each pairs每对的特殊分组号
【发布时间】:2018-08-01 11:22:34
【问题描述】:

这里已经回答了部分问题special-group-number-for-each-combination-of-data。在大多数情况下,我们在数据中包含对和其他数据值。我们想要实现的是,如果存在这些对,则对这些组进行编号,并将它们编号直到下一对。

当我集中每一对时,例如 c("bad","good") 想对它们进行分组,并为 c('Veni',"vidi","Vici") 分配唯一编号 666

这是示例数据

names <- c(c("bad","good"),1,2,c("good","bad"),111,c("bad","J.James"),c("good","J.James"),333,c("J.James","good"),761,'Veni',"vidi","Vici")

  df <- data.frame(names)

这是真实和一般情况下的预期输出

     names  Group
1      bad    1
2     good    1
3        1    1
4        2    1
5     good    2
6      bad    2
7      111    2
8      bad    3
9  J.James    3
10    good    4
11 J.James    4
12     333    4
13 J.James    5
14    good    5
15     761    5
16    Veni    666
17    vidi    666
18    Vici    666

【问题讨论】:

  • 为什么要在第 10 行开始一个新组。您将 good 和 Good 视为同一个词?
  • @Frank 不,不。只是打字错误。很抱歉!
  • 分组方案对我来说是 0 意义。请解释第 1:15 行的组。
  • @Vlo 一个组不能包含两次相同的值。第 5 行开始一个新组,因为 good 已经出现在当前组中;第 13 行开始了一个新组,因为 J.James 已经出现在当前组(第 4 组)中......似乎必须逐行完成,并且可能非常缓慢,但也许我错过了一些东西。跨度>
  • @Alexander 上面列出的数据是您的最终格式吗?如果您要每 2 分钟更改一次外观,则尝试解决此问题非常令人沮丧。通过最近的调整,您已经大大改变了“名称”的含义。

标签: r dplyr aggregate


【解决方案1】:

这里有两种方法可以为给定的样本数据集重现 OP 的预期结果。`

两者的工作方式相同。首先,所有“令人不安”的行,即不包含“有效”名称的行,都被跳过,具有“有效”名称的行被简单地按 2 组编号。其次,具有豁免名称的行被赋予特殊组数字。最后,NA 行通过将最后一个观察向前推进来填充。

data.table

library(data.table)
names <- c(c("bad","good"),1,2,c("good","bad"),111,c("bad","J.James"),c("good","J.James"),333,c("J.James","good"),761,'Veni',"vidi","Vici")
exempt <- c("Veni", "vidi", "Vici")
data.table(names)[is.na(as.numeric(names)) & !names %in% exempt, 
                  grp := rep(1:.N, each = 2L, length.out = .N)][
                    names %in% exempt, grp := 666L][
                      , grp := zoo::na.locf(grp)][]
      names grp
 1:     bad   1
 2:    good   1
 3:       1   1
 4:       2   1
 5:    good   2
 6:     bad   2
 7:     111   2
 8:     bad   3
 9: J.James   3
10:    good   4
11: J.James   4
12:     333   4
13: J.James   5
14:    good   5
15:     761   5
16:    Veni 666
17:    vidi 666
18:    Vici 666

dplyr/tidyr

这是我尝试提供dplyr/tidyr 解决方案:

library(dplyr)
as_tibble(names) %>% 
  mutate(grp = if_else(is.na(as.numeric(names)) & !names %in% exempt,  
                       rep(1:n(), each = 2L, length.out = n()),
                       if_else(names %in% exempt, 666L, NA_integer_))) %>% 
  tidyr::fill(grp)
# A tibble: 18 x 2
   value     grp
   <chr>   <int>
 1 bad         1
 2 good        1
 3 1           1
 4 2           1
 5 good        3
 6 bad         3
 7 111         3
 8 bad         4
 9 J.James     5
10 good        5
11 J.James     6
12 333         6
13 J.James     7
14 good        7
15 761         7
16 Veni      666
17 vidi      666
18 Vici      666

【讨论】:

  • 我刚刚注意到 Q 被标记为 dplyr - 我很抱歉。我的data.tabledplyr 流利得多,所以这可能需要一段时间...
  • 我设法提供了dplyr/tidyr 版本的data.table 方法。
  • 您的解决方案很优雅!以及我在寻找什么。太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多