Lets bring some data in!

PD <- read_csv("~/Documents/Roberts Lab/Primer Databse/PrimerDatabase - primers.csv")
Missing column names filled in: 'X18' [18], 'X19' [19], 'X20' [20], 'X21' [21], 'X22' [22], 'X23' [23], 'X24' [24], 'X25' [25]Parsed with column specification:
cols(
  .default = col_character(),
  sr_ID = col_integer(),
  `#bp` = col_integer(),
  `GC%` = col_double(),
  `melting temp` = col_double(),
  `IDT #` = col_integer()
)
See spec(...) for full column specifications.
5 parsing failures.
 row          col               expected actual
1365 melting temp a double                   . 
1457 sr_ID        no trailing characters     .2
1458 sr_ID        no trailing characters     .1
1461 sr_ID        no trailing characters     .1
1463 sr_ID        no trailing characters     .1
primerbox <- read_csv("~/Documents/Roberts Lab/Primer Databse/primerbox.csv")
Parsed with column specification:
cols(
  Position = col_character(),
  Name = col_character(),
  `SR ID` = col_integer(),
  `IDT #` = col_integer(),
  Organism = col_character(),
  Date = col_character(),
  Notes = col_character(),
  `Box Name` = col_character()
)

Well, that’s annoying. Looks lik there’s some leftover formatting stuff from pulling it down from Sheets.

PD <- PD[25:length(PD$`Primer Sequence`),1:17]
for( i in 1:ncol(PD))   {
  for(j in 1:nrow(PD))   {
      PD[j,i] <- tolower(PD[j,i])
      PD[j,i] <- gsub(" ", "_", PD[j,i])
      }
}
for( i in 1:ncol(primerbox))   {
  for(j in 1:nrow(primerbox))   {
      primerbox[j,i] <- tolower(primerbox[j,i])
      primerbox[j,i] <- gsub(" ", "_", primerbox[j,i])
      }
}
primerbox <- primerbox[-c(which(is.na(primerbox$Name) == TRUE)),]

Sufficiently sanitized, lets try a “join”

PD.test <- PD
PB.test <- primerbox
leftover = PB.test[1,]
counter = 1
for(i in 1:nrow(PB.test))   {
  for(j in 1:nrow(PD.test))   {
    if((!is.na(PD.test$sr_ID[j]) && !is.na(PB.test$`SR ID`[i])) && PD.test$sr_ID[j] == PB.test$`SR ID`[i])   {
      PD.test[j,18] <- PB.test$`Box Name`[i]
      PD.test[j,19] <- PB.test$Position[i]
      PD.test[j,20] <- PB.test$`IDT #`[i]
      PD.test[j,21] <- PB.test$Date[i]
      PD.test[j,22] <- PB.test$Notes[i]
    } else if(PD.test$`Primer name`[j] == PB.test$Name[i])  {
      PD.test[j,18] <- PB.test$`Box Name`[i]
      PD.test[j,19] <- PB.test$Position[i]
      PD.test[j,20] <- PB.test$`IDT #`[i]
      PD.test[j,21] <- PB.test$Date[i]
      PD.test[j,22] <- PB.test$Notes[i]
    } 
  }
}
colnames(PD.test)[18:22] <- c("Box_Name", "Box_Position", "IDT #", "Date", "Box_Notes")

The code below combines the two IDT # columns, setting column 17 to be the “master” column, but retains any values in column 20 that do not match.

for(i in 1:nrow(PD.test))   {
  if(!is.na(as.numeric(PD.test[i,17])) == TRUE && !is.na((as.numeric(PD.test[i,17]) != as.numeric(PD.test[i,20]))) && (as.numeric(PD.test[i,17]) == as.numeric(PD.test[i,20])) == TRUE )   {
    PD.test[i,20] <- NA
  }
}
NAs introduced by coercion
for(i in 1:nrow(PD.test))   {
  
  if(!is.na(as.numeric(PD.test[i,20])) == TRUE && (is.na(PD.test[i,17]) == TRUE))   {
    PD.test[i, 17] <- PD.test[i,20]
    PD.test[i,20] <- NA
  }
}
#write.csv(PD.test, "Combined_primer_database.csv")
LS0tCnRpdGxlOiAiUGxheWluZyB3aXRoIFByaW1lciBEYXRhYnNlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKTGV0cyBicmluZyBzb21lIGRhdGEgaW4hCgpgYGB7cn0KUEQgPC0gcmVhZF9jc3YoIn4vRG9jdW1lbnRzL1JvYmVydHMgTGFiL1ByaW1lciBEYXRhYnNlL1ByaW1lckRhdGFiYXNlIC0gcHJpbWVycy5jc3YiKQpwcmltZXJib3ggPC0gcmVhZF9jc3YoIn4vRG9jdW1lbnRzL1JvYmVydHMgTGFiL1ByaW1lciBEYXRhYnNlL3ByaW1lcmJveC5jc3YiKQoKYGBgCgoKV2VsbCwgdGhhdCdzIGFubm95aW5nLiBMb29rcyBsaWsgdGhlcmUncyBzb21lIGxlZnRvdmVyIGZvcm1hdHRpbmcgc3R1ZmYgZnJvbSBwdWxsaW5nIGl0IGRvd24gZnJvbSBTaGVldHMuIAoKYGBge3J9ClBEIDwtIFBEWzI1Omxlbmd0aChQRCRgUHJpbWVyIFNlcXVlbmNlYCksMToxN10KCmZvciggaSBpbiAxOm5jb2woUEQpKSAgIHsKICBmb3IoaiBpbiAxOm5yb3coUEQpKSAgIHsKICAgICAgUERbaixpXSA8LSB0b2xvd2VyKFBEW2osaV0pCiAgICAgIFBEW2osaV0gPC0gZ3N1YigiICIsICJfIiwgUERbaixpXSkKICAgICAgfQp9Cgpmb3IoIGkgaW4gMTpuY29sKHByaW1lcmJveCkpICAgewogIGZvcihqIGluIDE6bnJvdyhwcmltZXJib3gpKSAgIHsKICAgICAgcHJpbWVyYm94W2osaV0gPC0gdG9sb3dlcihwcmltZXJib3hbaixpXSkKICAgICAgcHJpbWVyYm94W2osaV0gPC0gZ3N1YigiICIsICJfIiwgcHJpbWVyYm94W2osaV0pCiAgICAgIH0KfQoKcHJpbWVyYm94IDwtIHByaW1lcmJveFstYyh3aGljaChpcy5uYShwcmltZXJib3gkTmFtZSkgPT0gVFJVRSkpLF0KYGBgCgpTdWZmaWNpZW50bHkgc2FuaXRpemVkLCBsZXRzIHRyeSBhICJqb2luIiAKYGBge3J9ClBELnRlc3QgPC0gUEQKUEIudGVzdCA8LSBwcmltZXJib3gKbGVmdG92ZXIgPSBQQi50ZXN0WzEsXQpjb3VudGVyID0gMQoKZm9yKGkgaW4gMTpucm93KFBCLnRlc3QpKSAgIHsKICBmb3IoaiBpbiAxOm5yb3coUEQudGVzdCkpICAgewogICAgaWYoKCFpcy5uYShQRC50ZXN0JHNyX0lEW2pdKSAmJiAhaXMubmEoUEIudGVzdCRgU1IgSURgW2ldKSkgJiYgUEQudGVzdCRzcl9JRFtqXSA9PSBQQi50ZXN0JGBTUiBJRGBbaV0pICAgewogICAgICBQRC50ZXN0W2osMThdIDwtIFBCLnRlc3QkYEJveCBOYW1lYFtpXQogICAgICBQRC50ZXN0W2osMTldIDwtIFBCLnRlc3QkUG9zaXRpb25baV0KICAgICAgUEQudGVzdFtqLDIwXSA8LSBQQi50ZXN0JGBJRFQgI2BbaV0KICAgICAgUEQudGVzdFtqLDIxXSA8LSBQQi50ZXN0JERhdGVbaV0KICAgICAgUEQudGVzdFtqLDIyXSA8LSBQQi50ZXN0JE5vdGVzW2ldCiAgICB9IGVsc2UgaWYoUEQudGVzdCRgUHJpbWVyIG5hbWVgW2pdID09IFBCLnRlc3QkTmFtZVtpXSkgIHsKICAgICAgUEQudGVzdFtqLDE4XSA8LSBQQi50ZXN0JGBCb3ggTmFtZWBbaV0KICAgICAgUEQudGVzdFtqLDE5XSA8LSBQQi50ZXN0JFBvc2l0aW9uW2ldCiAgICAgIFBELnRlc3RbaiwyMF0gPC0gUEIudGVzdCRgSURUICNgW2ldCiAgICAgIFBELnRlc3RbaiwyMV0gPC0gUEIudGVzdCREYXRlW2ldCiAgICAgIFBELnRlc3RbaiwyMl0gPC0gUEIudGVzdCROb3Rlc1tpXQogICAgfSAKICB9Cn0KCmNvbG5hbWVzKFBELnRlc3QpWzE4OjIyXSA8LSBjKCJCb3hfTmFtZSIsICJCb3hfUG9zaXRpb24iLCAiSURUICMiLCAiRGF0ZSIsICJCb3hfTm90ZXMiKQpgYGAKClRoZSBjb2RlIGJlbG93IGNvbWJpbmVzIHRoZSB0d28gSURUICMgY29sdW1ucywgc2V0dGluZyBjb2x1bW4gMTcgdG8gYmUgdGhlICJtYXN0ZXIiIGNvbHVtbiwgYnV0IHJldGFpbnMgYW55IHZhbHVlcyBpbiBjb2x1bW4gMjAgdGhhdCBkbyBub3QgbWF0Y2guIAoKYGBge3J9CmZvcihpIGluIDE6bnJvdyhQRC50ZXN0KSkgICB7CiAgaWYoIWlzLm5hKGFzLm51bWVyaWMoUEQudGVzdFtpLDE3XSkpID09IFRSVUUgJiYgIWlzLm5hKChhcy5udW1lcmljKFBELnRlc3RbaSwxN10pICE9IGFzLm51bWVyaWMoUEQudGVzdFtpLDIwXSkpKSAmJiAoYXMubnVtZXJpYyhQRC50ZXN0W2ksMTddKSA9PSBhcy5udW1lcmljKFBELnRlc3RbaSwyMF0pKSA9PSBUUlVFICkgICB7CiAgICBQRC50ZXN0W2ksMjBdIDwtIE5BCiAgfQp9Cgpmb3IoaSBpbiAxOm5yb3coUEQudGVzdCkpICAgewogIAogIGlmKCFpcy5uYShhcy5udW1lcmljKFBELnRlc3RbaSwyMF0pKSA9PSBUUlVFICYmIChpcy5uYShQRC50ZXN0W2ksMTddKSA9PSBUUlVFKSkgICB7CiAgICBQRC50ZXN0W2ksIDE3XSA8LSBQRC50ZXN0W2ksMjBdCiAgICBQRC50ZXN0W2ksMjBdIDwtIE5BCiAgfQp9Cgojd3JpdGUuY3N2KFBELnRlc3QsICJDb21iaW5lZF9wcmltZXJfZGF0YWJhc2UuY3N2IikKYGBgCgo=