重复样本ID/结果,并使用R重新编码为唯一和缺失

重复样本ID/结果,并使用R重新编码为唯一和缺失,r,R,我有一个由样本ID和相应的结果变量组成的数据集。但是,我的数据集中有一些重复的示例ID。我想做的是识别重复的样本ID,并将此样本ID重新编码为唯一名称,然后将结果变量重新编码为缺失。我知道删除整行会更容易,但我需要保留行数 所以我有这样一个数据集: dt<- data.frame(ID=c("A", "B", "A", "C"), Outcome=c("1", "1", "1", "1")) dt1<- data.frame(ID=c("A", "B", "A.1", "C"),

我有一个由样本ID和相应的结果变量组成的数据集。但是,我的数据集中有一些重复的示例ID。我想做的是识别重复的样本ID,并将此样本ID重新编码为唯一名称,然后将结果变量重新编码为缺失。我知道删除整行会更容易,但我需要保留行数

所以我有这样一个数据集:

dt<- data.frame(ID=c("A", "B", "A", "C"), Outcome=c("1", "1", "1", "1"))
dt1<- data.frame(ID=c("A", "B", "A.1", "C"), Outcome=c("1", "1", "-9", "1"))

dt数据集列为
factor
class。我将在
data.frame
调用中使用
stringsAsFactors=FALSE
创建类为“character”的非数字列。原因是,如果我们要更改“因子”类中的某些值/替换某些级别,我们需要将该新“值”作为该“因子”的“级别”之一。为了避免这种情况,我将已经存在的“factor”列转换为“character”。在本例中,两列都是“factor”类。因此,我们使用
lappy
循环遍历“dt”列,并将列更改为“character”(
as.character

在我们将“ID”转换为
唯一的
ID之后,我们可以检查该列中的
,并将“结果”列中的相应元素替换为-9

 dt$Outcome[grep('[.]', dt$ID)] <- -9
 dt
 #   ID Outcome
 #1   A       1
 #2   B       1
 #3 A.1      -9
 #4   C       1

你考虑过或尝试过什么?问题是什么?如果你在一些名字中已经有合法的点,
grep
是危险的。相反,在原件上使用重复的检查<代码>转换(dt,ID=make.unique(as.character(ID)),结果=ifelse(重复的(ID),-9,结果))
 dt$ID <- make.unique(dt$ID)
 dt$Outcome[grep('[.]', dt$ID)] <- -9
 dt
 #   ID Outcome
 #1   A       1
 #2   B       1
 #3 A.1      -9
 #4   C       1
 transform(dt,
       ID=make.unique(as.character(ID)), #change the ID column
       Outcome=ifelse(duplicated(ID),-9, ​Outcome)) #change Outcome