枚举数据框中的重复项

时间:2014-09-14 23:05:32

标签: r dataframe

我有这个例子data.frame

df <- data.frame(id = rep(letters[1:10],2), sub.id = c(rep("P",10), rep("M",10)), group = rep(c(rep("X", 7), rep("Y", 3)),2), class = rep(c(rep("A1", 5), rep("A2", 5)),2))

> df
   id sub.id group class
1   a      P     X    A1
2   b      P     X    A1
3   c      P     X    A1
4   d      P     X    A1
5   e      P     X    A1
6   f      P     X    A2
7   g      P     X    A2
8   h      P     Y    A2
9   i      P     Y    A2
10  j      P     Y    A2
11  a      M     X    A1
12  b      M     X    A1
13  c      M     X    A1
14  d      M     X    A1
15  e      M     X    A1
16  f      M     X    A2
17  g      M     X    A2
18  h      M     Y    A2
19  i      M     Y    A2
20  j      M     Y    A2

df$id对应的df$sub.id“P”和df$sub.id“M”出现两次。

我想添加一个列,列出不同组和类组合的复制,并尊重df$id值。因此生成的data.frame将是:

> df
   id sub.id group class replicate
1   a      P     X    A1         1
2   b      P     X    A1         2
3   c      P     X    A1         3
4   d      P     X    A1         4
5   e      P     X    A1         5
6   f      P     X    A2         6
7   g      P     X    A2         7
8   h      P     Y    A2         1
9   i      P     Y    A2         2
10  j      P     Y    A2         3
11  a      M     X    A1         1
12  b      M     X    A1         2
13  c      M     X    A1         3
14  d      M     X    A1         4
15  e      M     X    A1         5
16  f      M     X    A2         6
17  g      M     X    A2         7
18  h      M     Y    A2         1
19  i      M     Y    A2         2
20  j      M     Y    A2         3

1 个答案:

答案 0 :(得分:2)

您可以使用dplyr包执行此操作,如下所示:

library(dplyr)
df = df %>%
  group_by(group, sub.id) %>%
  mutate(replicate=1:length(id))

> df
Source: local data frame [20 x 5]
Groups: group, sub.id

   id sub.id group class replicate
1   a      P     X    A1         1
2   b      P     X    A1         2
3   c      P     X    A1         3
4   d      P     X    A1         4
5   e      P     X    A1         5
6   f      P     X    A2         6
7   g      P     X    A2         7
8   h      P     Y    A2         1
9   i      P     Y    A2         2
10  j      P     Y    A2         3
11  a      M     X    A1         1
12  b      M     X    A1         2
13  c      M     X    A1         3
14  d      M     X    A1         4
15  e      M     X    A1         5
16  f      M     X    A2         6
17  g      M     X    A2         7
18  h      M     Y    A2         1
19  i      M     Y    A2         2
20  j      M     Y    A2         3

dplyr还有内置函数n(),您可以使用它来代替length(),如下所示:

df = df %>%
  group_by(group, sub.id) %>%
  mutate(replicate=1:n())

n()会自动计算每个分组变量组合中的行数(在本例中为groupsub.id)。

在您的示例数据框中,id已按字母顺序排列。如果不是这种情况,并且如果replicate的数字顺序对应于id的字母顺序很重要,那么您可以先使用arrange对数据框进行排序功能。在下面的示例中,数据框首先按group排序,然后按sub.id排序,然后按id排序:

df = df %>%
  arrange(group, sub.id, id) %>%
  group_by(group, sub.id) %>%
  mutate(replicate=1:n())