Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 识别重复测量的对象,以及不同年份之间具有相同ID的对象_R_Classification_Repeat_Difference - Fatal编程技术网

R 识别重复测量的对象,以及不同年份之间具有相同ID的对象

R 识别重复测量的对象,以及不同年份之间具有相同ID的对象,r,classification,repeat,difference,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

我想在数据框中用同义字母对一些个人的姓名进行重新分类,重新分类标准必须在个人首次出现后每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
正如你所看到的,
ID==1
年==1
年==4
年==5
中有不同的
新ID
,因为我们假设如果一个人在
年==1
中第一次出现,那么在
年==3
中具有相同ID的个人是不同的,发生在
年==5
的个体也是如此


提前感谢。

ID您可以使用
dplyr
cut

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
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。我认为这些是错误的?

在最终输出中,您是否打算在第34行使用
Year==1
?此代码运行良好!!唯一的问题是,它表明行
new_-df[new_-df[,1]==i,2]中存在错误。我将代码的结果与正确的结果进行了比较,在我的输入和您的解决方案的输出之间创建了一个
cbind
,我发现一些结果不匹配。例如,
ID==6
出现在
行==6、21和24中,分别具有
年==1、3和4
Year==4
ID==6
new\u ID
应该与
Year==3
中的
new\u ID==R
相同,因为
ID==6
的第二次出现只有一年。我已尝试解决代码更改
diff(Year[ID==x])%%2,但我无法解决它。你能帮我吗?谢谢现在
new\u ID
for
ID==6
at
行==21和24
new\u ID=“R”
相同,我正在测试其他数据集,当我改变变量
Year
时,代码不起作用。e、 g.
ID@Ruben很抱歉反应太晚。我想你是对的。我如何改变时间间隔来考虑不同个体的同一个人?我尝试了最后一个
mutate
代码,即
2
,但它不起作用。例如,使用此数据集
ID
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