R 从多个观测值中指定一个ID
我有一个调查数据集,其中多次出现受访者。受访者通过ID识别。除此之外,还有第二个变量(IDPREV),该变量给出了先前识别受访者的ID(上次访谈时分配给受访者的ID)。我想为每个受访者创建一个唯一的ID,该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
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