如何在数据框列中查找因子向量的元素实例

时间:2017-08-30 13:28:03

标签: r dataframe

我有一个名为Categories的因子向量,含有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的特定值的出现次数填充数据框的位置列。所以,前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

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以尝试group_by中的mutatedplyr

library(dplyr)

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) %>% 
  group_by(cat) %>% 
  mutate(position = 1:n())

答案 1 :(得分:0)

我们可以使用group_by包中的row_numberdplyr

My_Data2 <- My_Data %>%
  group_by(cat) %>%
  mutate(position = row_number())

答案 2 :(得分:0)

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

此答案归功于docendo discimus