我想基于“Sample”生成“Duplicate”列。 003是样品ID,003r是同一样品的复制品。 “Sample”列中的复制样本名称前3个字符相同。
Sample <- c("001","002","003","003r","004","005","005r")
Value <- c(2,5,4,4,5,6,7)
Duplicate <- c(F,F,T,T,F,T,T)
df <- data.frame(Sample,Value,Duplicate)
df
Sample Value Duplicate
1 001 2 FALSE
2 002 5 FALSE
3 003 4 TRUE
4 003r 4 TRUE
5 004 5 FALSE
6 005 6 TRUE
7 005r 7 TRUE
我正在尝试使用ifelse
和grep
但是无法将它们组合在一起给我想要的结果,而我却陷入了困境。
我很感激你的帮助,谢谢。
答案 0 :(得分:0)
@David Arenburg是对的,你需要首先正式定义你的意思,然后部分匹配&#39;名。假设部分匹配是由样本中子字符串的位置1(开始)和3(停止)之间的完全匹配(相同)定义的,我们可以创建一个包含该子字符串的新列:
df$sample_substr <- substr(df$Sample,start = 1,stop = 3)
...然后简单地计算每个sample_substr的出现次数(频率)。我建议使用&#39; plyr&#39;包装(非常快):
library(plyr)
# group by 'sample_substr' and count the number of occurrences
df <- ddply(df, .(sample_substr), mutate, frequency=length(sample_substr))
# if frequency is 1, it is unique, i.e. not a duplicate. If frequency is > 1, it is not unique, i.e. a duplicate.
df$Dup <- ifelse(df$frequency==1, FALSE, TRUE)
# test if our definition of Dup holds the same value as yours in Duplicate
df$Dup==df$Duplicate