R 从多个观测值中指定一个ID

R 从多个观测值中指定一个ID,r,R,我有一个调查数据集,其中多次出现受访者。受访者通过ID识别。除此之外,还有第二个变量(IDPREV),该变量给出了先前识别受访者的ID(上次访谈时分配给受访者的ID)。我想为每个受访者创建一个唯一的ID,该ID在每次采访受访者时保持不变。受访者可以在数据集中出现多次。任何建议和想法都将不胜感激!谢谢大家! 结构看起来是这样的。不幸的是,它组织得不是很好,受访者可能会出现几次: structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, NA, NA, NA, NA, N

我有一个调查数据集,其中多次出现受访者。受访者通过ID识别。除此之外,还有第二个变量(IDPREV),该变量给出了先前识别受访者的ID(上次访谈时分配给受访者的ID)。我想为每个受访者创建一个唯一的ID,该ID在每次采访受访者时保持不变。受访者可以在数据集中出现多次。任何建议和想法都将不胜感激!谢谢大家!

结构看起来是这样的。不幸的是,它组织得不是很好,受访者可能会出现几次:

structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, NA, NA, NA, NA, NA, 
1, 2, 3, 4, 5), .Dim = c(10L, 2L), .Dimnames = list(NULL, c("ID", 
"IDPREV")))

可以将数据对象合并到其自身:

 dat <- structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, NA, NA, NA, NA, NA, 
 1, 2, 3, 4, 5), .Dim = c(10L, 2L), .Dimnames = list(NULL, c("ID", 
 "IDPREV")))
 dat2 <- merge(dat, dat, by.x=1, by.y=2)
Warning message:
In merge.data.frame(as.data.frame(x), as.data.frame(y), ...) :
  column name ‘ID’ is duplicated in the result

 dat2
#-----------------
  ID IDPREV ID
1  1     NA  6
2  2     NA  7
3  3     NA  8
4  4     NA  9
5  5     NA 10

dat像这样的东西应该很快收敛:

x      <- ifelse(is.na(df$IDPREV), df$ID, df$IDPREV)
update <- function(x) x[match(x, df$ID)]
y      <- update(x)

while(!identical(y, x)) {
  x <- y
  y <- update(x)
}

df$FINAL_ID <- x

这也可以被概念化为图形对象,并允许使用
igraph
包。例如,使用@flodel回答中的数据

df <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), 
                     IDPREV = c(NA, NA, NA, NA, NA, 1, 2, 3, 4, 5, 10, 11)),
                .Names = c("ID", "IDPREV"),
                row.names = c(NA, 12L), class = "data.frame")

require(igraph)    
# get rid of the effect of the NAs by matching these cases 
# back to themselves; make a graph; then extract the clusters
df$IDPREV[is.na(df$IDPREV)] <- df$ID[is.na(df$IDPREV)]
g.el <- graph.data.frame(df)
df$FINAL_ID_LM <- clusters(g.el)$membership

您好,一个简单的
dput()
会很有帮助。您的数据现在是什么样子的?(结构是什么?你在R或其他地方有吗等)你需要解释为什么第一个提到的ID是不够的。如果这些是R数据对象中的数据,则需要从以下位置提供输出:
dput(head(object))
。如果不是,那么这真的不是一个编程问题,是吗?ID不够,因为它是顺序的。三年后,我得到了第二个id(IDPREV),这是指受访者的最后一次观察结果;数据存储为数据集。我无法向您提供原始数据,因为数据集太长,我必须对其进行分层,而且是机密数据。我尝试过使用
igraph
复制您的答案。如果我遗漏了什么,请告诉我。
df <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), 
                     IDPREV = c(NA, NA, NA, NA, NA, 1, 2, 3, 4, 5, 10, 11)),
                .Names = c("ID", "IDPREV"),
                row.names = c(NA, 12L), class = "data.frame")
#    ID IDPREV FINAL_ID
# 1   1     NA        1
# 2   2     NA        2
# 3   3     NA        3
# 4   4     NA        4
# 5   5     NA        5
# 6   6      1        1
# 7   7      2        2
# 8   8      3        3
# 9   9      4        4
# 10 10      5        5
# 11 11     10        5
# 12 12     11        5
df <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), 
                     IDPREV = c(NA, NA, NA, NA, NA, 1, 2, 3, 4, 5, 10, 11)),
                .Names = c("ID", "IDPREV"),
                row.names = c(NA, 12L), class = "data.frame")

require(igraph)    
# get rid of the effect of the NAs by matching these cases 
# back to themselves; make a graph; then extract the clusters
df$IDPREV[is.na(df$IDPREV)] <- df$ID[is.na(df$IDPREV)]
g.el <- graph.data.frame(df)
df$FINAL_ID_LM <- clusters(g.el)$membership
> df
   ID IDPREV FINAL_ID_LM FINAL_ID_FL
1   1      1           1           1
2   2      2           2           2
3   3      3           3           3
4   4      4           4           4
5   5      5           5           5
6   6      1           1           1
7   7      2           2           2
8   8      3           3           3
9   9      4           4           4
10 10      5           5           5
11 11     10           5           5
12 12     11           5           5