识别具有重复测量的对象,并在年份之间使用相同的ID

时间:2015-08-31 11:47:06

标签: r classification repeat difference

我想用一个相继的字母重新分类数据框中某些个体的名字,重新分类标准必须改变自个人第​​一次出现以来的每个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。这是因为我们认为个人每2年死亡,ID可以重复使用。

在这个假设的案例中,我们假设一个人的生命是2年,并且我们可以在抽样时识别出不同的个体。 ID == 1Year == 1中的Year == 2代表同一个人,但ID == 1Year == 1,2Year == 3,4中的Year == 5代表相同的个人代表不同的人。这是因为来自ID == 1的{​​{1}}的个人无法活得那么久。问题在于,个人的第一次出现可能在不同年份发生,并且在这种情况下反复发生。因此,代码必须在第一次出现后每2年忘记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_IDYear == 1中有Year == 4不同,因为我们假设如果第一个人出现在Year == 5中的时间,Year == 1中具有相同ID的个人不同,与Year == 3中出现的个人相同。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以使用dplyrcut

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年的L具有相同的ID。我认为这些都是错误的?

答案 1 :(得分:1)

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)
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
# if all ID renews same use:
newID<-sapply(unique(ID), function(x) c(0,cumsum(diff(Year[ID==x]))%%2))
# if some ID renews different year use:
newID<-sapply(unique(ID), function(x) {
  mod<-2
  if(x==1) mod <- 3
  c(0,cumsum(diff(Year[ID==x]))%%mod)
 })
names(newID)<-(unique(ID))

new_df<-data.frame(ID,Year,IDcond=NA,new_ID=NA)
for(i in unique(ID)){
  new_df[new_df[,1]==i,3]<-newID[[which(unique(ID)==i)]]
}

ltrs<-c(LETTERS,apply(combn(LETTERS,2,simplify = T),2,function(x) paste(x,sep = "",collapse = "")))

ltrn<-0
for(i in 1:nrow(new_df)){
  if(new_df[i,3]==0) {ltrn<-ltrn+1;new_df[i,4]<-ltrs[ltrn]}
  else {ind<-which(new_df[,1]==new_df[i,1])
        ind<-ind[ind<i]
        new_df[i,4]<-tail(new_df[ind,4],1)}
}

new_df

> new_df
   ID Year IDcond new_ID
1   1    1      0      A
2   2    1      0      B
3   3    1      0      C
4   4    1      0      D
5   5    1      0      E
6   6    1      0      F
7   7    1      0      G
8   1    2      1      A
9   2    2      1      B
10  3    2      1      C
11  8    2      0      H
12  9    2      0      I
13 10    2      0      J
14 11    2      0      K
15 12    2      0      L
16  1    3      0      M
17  2    3      0      N
18  3    3      0      O
19  4    3      0      P
20  5    3      0      Q
21  6    3      0      R
22  1    4      1      M
23  2    4      1      N
24  6    4      1      R
25  8    4      0      S
26 12    4      0      T
27  7    5      0      U
28 15    5      0      V
29 16    5      0      W
30 17    5      0      X
31 18    5      0      Y
32 19    5      0      Z
33 20    5      0     AB
34  1    5      0     AC
35 21    6      0     AD
36 22    6      0     AE
37 19    6      1      Z