【问题标题】:how to find min and max number of intervening items between first multiple occurences of values in a data frame column如何在数据框列中第一次多次出现的值之间查找最小和最大干预项数
【发布时间】:2017-10-26 23:40:58
【问题描述】:

我有一个称为类别的因子向量,有 47 个级别

Categories = as.factor(sort(make.unique(rep(letters, length.out = 47), sep='')))

[1] a  a1 b  b1 c  c1 d  d1 e  e1 f  f1 g  g1 h  h1 i  i1 j  j1 k  k1 l  l1 m  m1 n  n1 o  o1 p  p1 q  q1 r  r1 s  s1 t 
[40] t1 u  u1 v  w  x  y  z 
47 Levels: a a1 b b1 c c1 d d1 e e1 f f1 g g1 h h1 i i1 j j1 k k1 l l1 m m1 n n1 o o1 p p1 q q1 r r1 s s1 t t1 u u1 ... z

我有另一个称为 cat 的向量,其中有 9 个级别

cat = Categories[c(7,42,43,24,45,26,35,6,15)]
[1] d  u1 v  l1 x  m1 r  c1 h 
47 Levels: a a1 b b1 c c1 d d1 e e1 f f1 g g1 h h1 i i1 j j1 k k1 l l1 m m1 n n1 o o1 p p1 q q1 r r1 s s1 t t1 u u1 ... z

我还有一个包含 36 行的数据框 My_Data。数据框中的一列多次出​​现来自 cat 的值

My_Data = data.frame(name = make.unique(rep(c(1:10,LETTERS), length.out = 36), sep=''), cat = sample(rep(cat,4),36,replace = FALSE), position = 0)

    name cat position
1     1   v        0
2     2   r        0
3     3   h        0
4     4  m1        0
5     5   h        0
6     6  u1        0
7     7  l1        0
8     8   h        0
9     9  u1        0
10   10   x        0
11    A   x        0
12    B   v        0
13    C   d        0
14    D  c1        0
15    E   r        0
16    F   v        0
17    G  l1        0
18    H   d        0
19    I  l1        0
20    J  c1        0
21    K  u1        0
22    L   x        0
23    M   v        0
24    N   d        0
25    O  l1        0
26    P  m1        0
27    Q   r        0
28    R  m1        0
29    S   h        0
30    T  m1        0
31    U  c1        0
32    V   d        0
33    W   r        0
34    X   x        0
35    Y  c1        0
36    Z  u1        0

使用下面的代码,我可以填充上面给出的位置列,以反映值在 cat 列中的出现次数:

transform(My_Data, position = ave(as.character(cat), cat, FUN = seq_along))

数据框 My_Data 的前 15 行如下所示:

    name cat position
1     1   v        1
2     2   r        1
3     3   h        1
4     4  m1        1
5     5   h        2
6     6  u1        1
7     7  l1        1
8     8   h        3
9     9  u1        2
10   10   x        1
11    A   x        2
12    B   v        2
13    C   d        1
14    D  c1        1
15    E   r        2

现在我想计算最小值。和最大。 cat 列的相同值的任意 2 次连续出现之间的干预项数。

我该怎么做?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    如果我理解您的问题,这里有一个选项:

    library(tidyverse)
    
    # Data
    Categories = as.factor(sort(make.unique(rep(letters, length.out = 47), sep='')))  
    cat = Categories[c(7,42,43,24,45,26,35,6,15)]
    # Set a seed for reproducibility
    set.seed(5)
    My_Data = data.frame(name = make.unique(rep(c(1:10,LETTERS), length.out = 36), sep=''), 
                         cat = sample(rep(cat,4),36,replace = FALSE), 
                         position = 0)
    

    下面的代码总结了cat 的每个级别的最小和最大干预行数。

    # Summarise to give min and max number rows between each occurrence
    My_Data %>%
      mutate(row=1:n()) %>% 
      group_by(cat) %>% 
      summarise(min.diff=min(diff(row)-1, na.rm=TRUE),
                max.diff=max(diff(row)-1, na.rm=TRUE))
    
         cat min.diff max.diff
      <fctr>    <dbl>    <dbl>
    1     c1        4        6
    2      d        1       16
    3      h        1       16
    4     l1        0       13
    5     m1        0       12
    6      r        5       15
    7     u1        2        7
    8      v        1       16
    9      x        6       12
    

    如果要标记原始数据框中的中间行数:下面的代码在原始数据框中添加一列,以给出自上次出现给定级别cat 以来的中间行数。

    # Add column with intervening number of rows between each occurrence in cat
    My_Data %>%
      mutate(row=1:n()) %>% 
      group_by(cat) %>% 
      mutate(diff=c(NA,diff(row)-1)) %>%
      select(-row)
    
         name    cat position  diff
       <fctr> <fctr>    <dbl> <dbl>
     1      1     c1        0    NA
     2      2     m1        0    NA
     3      3      x        0    NA
     4      4      d        0    NA
     5      5     l1        0    NA
     6      6     l1        0     0
     7      7      r        0    NA
     8      8     c1        0     6
     9      9      h        0    NA
    10     10      v        0    NA
    

    【讨论】:

      【解决方案2】:

      这是一个使用lag()的整洁解决方案:

      library(tidyverse)
      
      # create data frame
      set.seed(1)
      Categories <- as.factor(sort(make.unique(rep(letters, length.out = 47), sep='')))
      cat <- Categories[c(7,42,43,24,45,26,35,6,15)]
      My_Data <- data.frame(
        name = make.unique(rep(c(1:10,LETTERS), length.out = 36), sep=''), 
        cat = sample(rep(cat,4),36,replace = FALSE), 
        position = 0
      )
      
      # solution
      My_Data %>%
        mutate(row = 1:n()) %>%
        group_by(cat) %>%
        mutate(inter = row - lag(row) - 1) %>%
        summarize(min_inter = min(inter, na.rm = T), max_inter = max(inter, na.rm = T))
      

      结果:

      # A tibble: 9 x 3
           cat min_inter max_inter
        <fctr>     <dbl>     <dbl>
      1     c1         0        10
      2      d         4        11
      3      h         0         8
      4     l1         0         6
      5     m1         1         3
      6      r         0        16
      7     u1         2         5
      8      v         1        23
      9      x         6        15
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 2016-01-16
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多