r-基于多列分配ID列



下面的问题在这里得到了解决:创建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(

  1. 第N列重复,第n1列为FALSE,或者
  2. 列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列,但如果:,则标记为重复数字

  1. 列NC重复,OR
  2. new_ID_N重复,OR
  3. 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(...),其中...=具有所需变量的pasteinteraction调用。

但对于n1c1,我所能想到的只是一个循环。这需要先排序!请注意,您在TRUEFALSE周围有引号,我删除了它们。

最新更新