首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标识重复度量的对象,年间ID相同

标识重复度量的对象,年间ID相同
EN

Stack Overflow用户
提问于 2015-08-31 19:47:06
回答 2查看 204关注 0票数 2

我想用相应的字母对数据帧中的一些个体的名字进行重新分类,并且重新分类标准必须改变自个体首次出现以来的每X个间隔。我用一个例子更好地解释了它。

代码语言:javascript
复制
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年来的重复测量。如您所见,像"1" or "8"这样的一些IDsYear == 1,2,3,4,5中重复用于ID == 1,而Year == 2,4用于ID == 8。然而,如果一个个体第一次出现以来已经发生了一段时间,不同的个体可能具有相同的ID。这是因为我们认为每个人每两年就会死亡一次,ID可能会被重复使用。

在这个假设的情况下,我们假设一个人的寿命是2年,并且我们可以在采样过程中完美地识别不同的人。Year == 1Year == 2中的ID == 1代表相同的个体,而Year == 1,2Year == 3,4Year == 5中的ID == 1代表不同的个体。这是因为来自Year == 1ID == 1携带者活不了那么久。问题是,个体的第一次出现可能发生在不同的年份,并重复出现,就像这种情况一样。因此,代码必须在第一次出现后每两年忘记一次ID,并将新出现的事件归类为新的个体。

我想用唯一的ID命名每个人。新名称不必按时间顺序排列,就像您在Year == 5中看到的ID == 1一样。我只希望他们的名字是唯一的。

下面我已经把预期的结果放在了下面。

代码语言:javascript
复制
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 == 1Year == 1 Year == 4Year == 5中具有不同的new_ID,因为我们假设如果一个个体第一次出现在Year == 1中,那么在Year == 3中具有相同ID的个体是不同的,在Year == 5中出现的个体也是不同的。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-08-31 21:06:09

您可以使用dplyrcut

代码语言:javascript
复制
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行,其中你在第二年和第四年有一个具有相同ID的L。我认为这是错误的?

票数 2
EN

Stack Overflow用户

发布于 2015-08-31 20:57:29

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32310520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档