R - 识别部分字符串匹配的其余部分或在列

时间:2017-03-12 10:30:19

标签: r regex

我想基于“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

我正在尝试使用ifelsegrep但是无法将它们组合在一起给我想要的结果,而我却陷入了困境。 我很感激你的帮助,谢谢。

1 个答案:

答案 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