Ich habe in Python eine ähnliche Frage gestellt ( Wie erstelle ich eine Spalte mit aufsteigenden Werten basierend auf eindeutigen Werten in einer anderen Spalte in Pandas ) und das Skript zum Laufen gebracht, aber aus verschiedenen Gründen muss ich jetzt in R dasselbe erreichen. Ich füge hier auch die Komplexität hinzu, wenn ich in der Lage sein möchte, dem Datensatz regelmäßig neue Datenstapel hinzuzufügen.
Ich habe eine Liste von Proben mit eindeutigen Proben-ID-Nummern ("Sample_ID"). Jede Zeile des Datensatzes ist ein Beispiel. Einige Beispiele werden mehrmals dupliziert. Ich möchte einen neuen Satz von Beispielnamen ("Sample_code") erstellen, der von 1 aufsteigt, wenn Sie mit einem Präfix (z. B. "SAMP00001", "SAMP00002" usw.) durch die Zeilen gehen. Ich möchte, dass die Reihenfolge der Zeilen beibehalten wird (da sie ungefähr in der Datumsreihenfolge der Probensammlung liegen). Und für doppelte Samples möchte ich, dass die für Sample_code angegebene Nummer der ersten Zeile entspricht, in der die Sample-ID angezeigt wird, und nicht den Zeilen weiter unten in der Tabelle (die später in der Samplesammlung angezeigt wurden).
Meine Startdaten sind mit df1 dargestellt:
# df1
Sample_ID <- c('123123','123456','123123','123789')
Date <- c('15/06/2019', '23/06/2019', '30/06/2019', '07/07/2019')
Variable <- c("blue","red","red","blue")
Batch <- 1
df1 <- data.frame(Sample_ID, Date, Variable, Batch)
df1
Ich möchte die in df1b gezeigte Spalte Sample_code erstellen:
# df1b
Sample_ID <- c('123123','123456','123123','123789')
Date <- c('15/06/2019', '23/06/2019', '30/06/2019', '07/07/2019')
Variable <- c("blue","red","red","blue")
Batch <- 1
Sample_code <- c('SAMP0001', 'SAMP0002', 'SAMP0001', 'SAMP0003')
df1b <- data.frame(Sample_ID, Date, Variable, Batch, Sample_code)
df1b
Ich würde an dieser Stelle df1b und die für die Weiterverarbeitung verwendeten Sample_code-Namen speichern. Die zusätzliche Komplexität entsteht, weil ich dann eine neue Charge von Samples sammeln werde - nennen wir es df2 (Batch 2 Samples):
# df2
Sample_ID <- c('456789', '123654', '123123', '123789', '121212')
Date <- c('15/07/2019', '31/07/2019', '12/08/2019', '27/08/2019', '31/08/2019')
Variable <- c("blue", "red","blue", "red", "red")
Batch <- 2
df2 <- data.frame(Sample_ID, Date, Variable, Batch)
df2
Ich möchte df2 an den unteren Rand von df1 binden und mehr Sample_code-Namen für die neuen Zeilen generieren. Wichtig ist, dass die neuen Sample_code-Namen alle in df1 vorhandenen Sample_ID-Duplikate berücksichtigen müssen, aber auch keinen der Sample_code-Namen ändern müssen, die bereits zugewiesen wurden, als ich nur df1 hatte. Das Ergebnis an dieser Stelle wäre unten df2b:
# df2b
Sample_ID <- c('123123','123456','123123','123789','456789', '123654', '123123', '123789', '121212')
Date <- c('15/06/2019', '23/06/2019', '30/06/2019', '07/07/2019', '15/07/2019', '31/07/2019', '12/08/2019', '27/08/2019', '31/08/2019')
Variable <- c("blue","red","red","blue","blue", "red","blue", "red", "red")
Batch <- c(1,1,1,1,2,2,2,2,2)
Sample_code <- c('SAMP0001', 'SAMP0002', 'SAMP0001', 'SAMP0003', 'SAMP0004', 'SAMP0005', 'SAMP0001', 'SAMP0003', 'SAMP0006')
df2b <- data.frame(Sample_ID, Date, Variable, Batch, Sample_code)
df2b
Und dann würde ich Batch 3 Samples auf die gleiche Weise hinzufügen usw. usw.
Ich schätze, dass dieses Problem mindestens zwei Stufen umfasst: 1) Erstellen einer aufsteigenden Liste von Sample_code-Namen unter Verwendung eindeutiger Sample_ID-Werte; und 2) iteratives Erstellen von Probenstapeln. Da sich der zweite Punkt jedoch auf die Funktionalität auswirkt, die ich für die Sample_code-Namen möchte, habe ich hier beide Stufen aufgenommen.
Schließlich - idealerweise möchte ich dafür nur Basis-R- und Tidyverse-Pakete verwenden.
Jede Hilfe sehr geschätzt! Vielen Dank.
Da Sie vor der Zuweisung des Beispielcodes alle möglichen Beispiel-IDs kennen müssen, sollten Sie die Reihenfolge umkehren, indem Sie rbind
alle Beispieldatenrahmen aufrufen . Weisen Sie dann den Sample_code mithilfe von factor
Ebenen zu. Andernfalls weisen Sie Sample_code jedem Batch - Datenrahmen neu zu.
# BUILD A LIST OF DATA FRAMES BY CALLING lapply ON ITERATIVE PROCESS
# df_list <- lapply(batch_iterable, method_to_build_sample)
df_list <- list(df1, df1b, df2) # FOR THIS PARTICULAR POST
# RBIND ALL DFs TOGETHER
df2b <- do.call(rbind, df_list)
df2b <- within(df2b, {
# CONVERT TO CHARACTER
Sample_ID <- as.character(Sample_ID)
# CONVERT TO FACTOR AT POSITIONED VALUES, THEN INTEGER FOR LEVEL NUMBER
Sample_code <- as.character(as.integer(factor(Sample_ID, levels = unique(Sample_ID))))
# RE-ASSIGN WITH SAMP AND LEADING ZEROS
Sample_code <- ifelse(nchar(Sample_code) == 1, paste0('SAMP000', Sample_code),
ifelse(nchar(Sample_code) == 2, paste0('SAMP00', Sample_code),
ifelse(nchar(Sample_code) == 3, paste0('SAMP0', Sample_code), NA)
)
)
})
df2b
# Sample_ID Date Variable Batch Sample_code
# 1 123123 15/06/2019 blue 1 SAMP0001
# 2 123456 23/06/2019 red 1 SAMP0002
# 3 123123 30/06/2019 red 1 SAMP0001
# 4 123789 07/07/2019 blue 1 SAMP0003
# 5 456789 15/07/2019 blue 2 SAMP0004
# 6 123654 31/07/2019 red 2 SAMP0005
# 7 123123 12/08/2019 blue 2 SAMP0001
# 8 123789 27/08/2019 red 2 SAMP0003
# 9 121212 31/08/2019 red 2 SAMP0006
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen