我想用连续的字母对数据框中某些个体的姓名进行重新分类,并且重新分类标准必须更改自个体第一次出现以来的每个 X 间隔。我用一个例子更好地解释它。
ID <- c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 1, 2, 6, 8, 12, 7, 15, 16, 17, 18, 19, 20, 1, 21, 22, 19 )
Year <- c (1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6)
df <- data.frame (ID, Year)
df
我有一个数据集,其中包含 6 年来对某些人的重复测量。正如你所看到的一些IDs
就像 "1" or "8"
Year == 1,2,3,4,5
中重复对于ID == 1
和Year == 2,4
对于ID == 8
。然而不同的人可能有相同的ID
如果自某个个体第一次出现以来已经发生了一段时间。这是因为我们认为个体每两年就会死亡一次,而ID
可以重复使用。
在这个假设的情况下,我们假设个体的生命周期是 2 年,并且我们可以在采样过程中完美地识别不同的个体。 ID == 1
在 Year == 1
和Year == 2
代表同一个人,但是 ID == 1
在 Year == 1,2
, Year == 3,4
和Year == 5
代表不同的个体。这是因为 ID == 1
的个体来自Year == 1
活不了那么久。问题是,个体的第一次出现可能会发生在不同的年份,并且会像本例一样重复出现。所以代码必须忘记 ID
自第一次出现后每两年一次,将新出现的事件分类为新个体。
我想为每个人命名一个独特的 ID
。新名称不必按时间顺序排列,如 ID == 1
所示。在 Year == 5
。我只希望他们能有一个独特的名字。
下面我已经给出了预期的结果。
ID <- c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 1, 2, 6, 8, 12, 7, 15, 16, 17, 18, 19, 20, 1, 21, 22, 19 )
Year <- c (1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 1, 6, 6, 6)
new_ID <- c("A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "M", "N", "Q", "S", "L", "T", "U", "V", "W", "X", "Y", "Z", "CC", "AA", "BB", "Y")
new_df <- data.frame (ID, Year, new_ID)
new_df
如您所见 ID == 1
有不同new_ID
在 Year == 1
Year == 4
和Year == 5
,因为我们假设如果一个个体第一次出现在Year == 1
中, Year == 3
中具有相同 ID 的个人是不同的,并且与 Year == 5
中出现的个体相同。 。
提前致谢。
最佳答案
您可以使用dplyr
和cut
:
library(dplyr)
df %>% group_by(ID) %>%
mutate(x = as.numeric(cut(Year, seq(min(Year)-1, max(Year)+1, 2))),
idout = paste0(ID, ".", x))
ID Year x idout
1 1 1 1 1.1
2 2 1 1 2.1
3 3 1 1 3.1
4 4 1 1 4.1
5 5 1 1 5.1
6 6 1 1 6.1
7 7 1 1 7.1
8 1 2 1 1.1
9 2 2 1 2.1
10 3 2 1 3.1
11 8 2 1 8.1
12 9 2 1 9.1
13 10 2 1 10.1
14 11 2 1 11.1
15 12 2 1 12.1
16 1 3 2 1.2
17 2 3 2 2.2
18 3 3 2 3.2
19 4 3 2 4.2
20 5 3 2 5.2
21 6 3 2 6.2
22 1 4 2 1.2
23 2 4 2 2.2
24 6 4 2 6.2
25 8 4 2 8.2
26 12 4 2 12.2
27 7 5 3 7.3
28 15 5 1 15.1
29 16 5 1 16.1
30 17 5 1 17.1
31 18 5 1 18.1
32 19 5 1 19.1
33 20 5 1 20.1
34 1 5 3 1.3
35 21 6 1 21.1
36 22 6 1 22.1
37 19 6 1 19.1
注意,与您所需的输出有两个不匹配之处:第 34 行和第 15,26 行,其中您在第 2 年和第 4 年有一个具有相同 ID 的 L。我认为这些都是错误?
关于r - 识别具有重复测量且多年之间具有相同 ID 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32310520/