我有这个例子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
答案 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()
会自动计算每个分组变量组合中的行数(在本例中为group
和sub.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())