下面的问题在这里得到了解决:创建ID变量:如果≥1列重复,则标记为重复此处:根据重复的整数变量和逻辑变量分配ID
我想创建一个新的列,该列具有基于多个列的多个条件的ID代码。这是我的数据样本。
pat N C NC n1 c1
1 1 1 1 1 FALSE FALSE
2 2 1 1 1 FALSE FALSE
3 3 12 31 2 FALSE FALSE
4 4 12 31 2 FALSE FALSE
5 5 3 15 3 FALSE TRUE
6 6 4 15 4 FALSE TRUE
7 7 5 18 5 TRUE FALSE
8 8 5 20 6 TRUE FALSE
9 9 6 21 7 FALSE FALSE
10 10 7 21 8 FALSE FALSE
11 11 8 19 9 FALSE FALSE
12 12 9 11 10 FALSE FALSE
13 13 10 11 11 FALSE FALSE
14 14 11 14 12 FALSE FALSE
sample <- data.frame(pat = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14),
N = c(1,1,12,12,3,4,5,5,6,7,8,9,10,11),
C = c(1,1,31,31,15,15,18,20,21,21,19,11,11,14),
NC = c(1,1,2,2,3,4,5,6,7,8,9,10,11,12),
n1 = c("FALSE", "FALSE","FALSE", "FALSE", "FALSE", "FALSE","TRUE","TRUE","FALSE","FALSE", "FALSE","FALSE", "FALSE", "FALSE"),
c1 = c("FALSE", "FALSE","FALSE", "FALSE", "TRUE", "TRUE","FALSE","FALSE","FALSE","FALSE", "FALSE","FALSE", "FALSE", "FALSE"))
编辑:在一些帮助下,我现在已经为这两个条件创建了新的ID列(根据重复的整数变量和逻辑变量分配ID(
- 第N列重复,第n1列为FALSE,或者
- 列C是重复的,列c1是FALSE
数据帧现在看起来像这样:
pat N C NC n1 c1 new_ID_N new_ID_C
1 1 1 1 1 FALSE FALSE 1 1
2 2 1 1 1 FALSE FALSE 1 1
3 3 12 31 2 FALSE FALSE 2 2
4 4 12 31 2 FALSE FALSE 2 2
5 5 3 15 3 FALSE TRUE 3 3
6 6 4 15 4 FALSE TRUE 4 4
7 7 5 18 5 TRUE FALSE 5 5
8 8 5 20 6 TRUE FALSE 6 6
9 9 6 21 7 FALSE FALSE 7 7
10 10 7 21 8 FALSE FALSE 8 7
11 11 8 19 9 FALSE FALSE 9 8
12 12 9 11 10 FALSE FALSE 10 9
13 13 10 11 11 FALSE FALSE 11 9
14 14 11 14 12 FALSE FALSE 12 10
最后,我想创建最后一个带有数字的new_ID列,但如果:,则标记为重复数字
- 列NC重复,OR
- new_ID_N重复,OR
- new_ID_C重复
我已经尝试了答案中建议的脚本
sample <- data.table::as.data.table(sample)[
j = new_ID := base::as.numeric(base::interaction(var1, var..., varn,
drop=TRUE))
]
但这显示了一条错误消息"(无法分配大小为…的矢量,在附加警告消息中:in ans lenght(l(:由整数溢出产生的NA(。
提前感谢
此代码使基于多个变量创建唯一ID成为可能。
sample <- data.table::as.data.table(sample)[
j = new_ID := base::as.numeric(base::interaction(var1, var..., varn,
drop=TRUE))
]
由于我不太清楚你的解释,我让你自己试试。我认为您必须为每个条件创建一个新的变量/列,然后将这些变量放入代码中。
这里有一个选项:
sample <- data.frame(pat = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14),
N = c(1,1,12,12,3,4,5,5,6,7,8,9,10,11),
C = c(1,1,31,31,15,15,18,20,21,21,19,11,11,14),
NC = c(1,1,2,2,3,4,5,6,7,8,9,10,11,12),
n1 = c(FALSE, FALSE,FALSE, FALSE, FALSE, FALSE,TRUE,TRUE,FALSE,FALSE, FALSE,FALSE, FALSE, FALSE),
c1 = c(FALSE, FALSE,FALSE, FALSE, TRUE, TRUE,FALSE,FALSE,FALSE,FALSE, FALSE,FALSE, FALSE, FALSE))
sample <- sample[order(sample$NC, sample$N, sample$C), ]
id <- 1
sample[1, 'new_ID'] <- id
for (i in 2:nrow(sample)) {
if (((sample[i, 'NC'] != sample[i - 1, 'NC']) | sample[i - 1, 'n1']) &
((sample[i, 'C'] != sample[i - 1, 'C']) | sample[i - 1, 'c1'])) {
id <- id + 1
}
sample[i, 'new_ID'] <- id
}
> sample
pat N C NC n1 c1 new_ID
1 1 1 1 1 FALSE FALSE 1
2 2 1 1 1 FALSE FALSE 1
3 3 12 31 2 FALSE FALSE 2
4 4 12 31 2 FALSE FALSE 2
5 5 3 15 3 FALSE TRUE 3
6 6 4 15 4 FALSE TRUE 4
7 7 5 18 5 TRUE FALSE 5
8 8 5 20 6 TRUE FALSE 6
9 9 6 21 7 FALSE FALSE 7
10 10 7 21 8 FALSE FALSE 7
11 11 8 19 9 FALSE FALSE 8
12 12 9 11 10 FALSE FALSE 9
13 13 10 11 11 FALSE FALSE 9
14 14 11 14 12 FALSE FALSE 10
如果没有n1
/c1
约束,您应该能够使用as.integer(factor(...)
,其中...
=具有所需变量的paste
或interaction
调用。
但对于n1
和c1
,我所能想到的只是一个循环。这需要先排序!请注意,您在TRUE
和FALSE
周围有引号,我删除了它们。