Skip to content

Commit fc988b9

Browse files
Add famID assignment to phantom parent rows
Phantom parents created during pedigree repair now inherit famID where available. Updated addParentRow to accept famID, adjusted logic in checkParentIDs and addRowlessParents to assign famID, and expanded tests to verify famID handling for phantom parents.
1 parent f5ec269 commit fc988b9

4 files changed

Lines changed: 59 additions & 8 deletions

File tree

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Created ped2gen function to extract generation information from pedigree data.frames
44
* Added tests for ped2gen
55
* Fixed handling of character ID variables leading to a warning in ped2fam
6+
* Added famIDs to phantom parents
67

78
# BGmisc 1.5.1
89
## CRAN submission

R/checkParents.R

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ checkParentIDs <- function(ped, verbose = FALSE, repair = FALSE,
173173
}
174174
}
175175
}
176-
if (addphantoms) {
176+
if (addphantoms==TRUE) {
177177
# Generate new IDs
178178
newIDbase <- if (is.numeric(ped$ID)) max(ped$ID, na.rm = TRUE) + 1 else paste0("phantom-", seq_len(nrow(ped)))
179179
# Initialize a dataframe to store new entries
@@ -196,19 +196,38 @@ checkParentIDs <- function(ped, verbose = FALSE, repair = FALSE,
196196
newID <- if (is.numeric(ped$ID)) newIDbase + added_counter else paste0("phantom-dad-", ped$ID[idx])
197197
added_counter <- added_counter + 1
198198
ped$dadID[idx] <- newID
199+
if ("famID" %in% names(ped)){
200+
newFAMID <- unique(ped$famID[idx])
201+
newFAMID <- newFAMID[!is.na(newFAMID)]
199202

200-
203+
new_entry <- addParentRow(new_entry_base, newID = newID, dadID = NA, momID = NA, sex = inferred_sex, famID = newFAMID)
204+
} else {
201205
new_entry <- addParentRow(new_entry_base, newID = newID, dadID = NA, momID = NA, sex = inferred_sex)
206+
}
202207
new_entries <- rbind(new_entries, new_entry)
203208
}
204209

205210
# Add moms when missing
206-
inferred_sex <- if (length(validation_results$female_var) > 0 && !is.na(validation_results$female_var)) validation_results$female_var else 0
211+
inferred_sex <- if (length(validation_results$female_var) > 0 && !is.na(validation_results$female_var)){
212+
validation_results$female_var
213+
} else {
214+
0
215+
}
216+
207217
for (idx in which(!is.na(ped$dadID) & is.na(ped$momID))) {
208218
newID <- if (is.numeric(ped$ID)) newIDbase + added_counter else paste0("phantom-mom-", ped$ID[idx])
209219
added_counter <- added_counter + 1
210220
ped$momID[idx] <- newID
221+
222+
if ("famID" %in% names(ped)){
223+
newFAMID <- unique(ped$famID[idx])
224+
newFAMID <- newFAMID[!is.na(newFAMID)]
225+
226+
new_entry <- addParentRow(new_entry_base, newID = newID, dadID = NA, momID = NA, sex = inferred_sex, famID = newFAMID)
227+
} else {
228+
211229
new_entry <- addParentRow(new_entry_base, newID = newID, dadID = NA, momID = NA, sex = inferred_sex)
230+
}
212231
new_entries <- rbind(new_entries, new_entry)
213232
}
214233

@@ -300,7 +319,19 @@ addRowlessParents <- function(ped, verbose, validation_results) {
300319
)
301320
inferred_sex <- if ("mom" %in% role) validation_results$female_var else validation_results$male_var
302321

303-
new_entry <- addParentRow(new_entry_base, newID = pid, dadID = NA, momID = NA, sex = inferred_sex)
322+
if("famID" %in% names(ped)){
323+
newFAMID <- unique(ped$famID[which(ped$momID == pid | ped$dadID == pid)])
324+
newFAMID <- newFAMID[!is.na(newFAMID)]
325+
326+
327+
if(length(newFAMID) >1){
328+
newFAMID <- NA
329+
}
330+
331+
new_entry <- addParentRow(new_entry_base, newID = pid, dadID = NA, momID = NA, sex = inferred_sex, famID = newFAMID)
332+
} else {
333+
new_entry <- addParentRow(new_entry_base, newID = pid, dadID = NA, momID = NA, sex = inferred_sex)
334+
}
304335

305336
new_entries <- rbind(new_entries, new_entry)
306337
}
@@ -324,16 +355,24 @@ addRowlessParents <- function(ped, verbose, validation_results) {
324355
#' @param sex The new parent's sex value (e.g., 0 for female, 1 for male, or "F"/"M")
325356
#' @param momID The new parent's mother ID (default is NA)
326357
#' @param dadID The new parent's father ID (default is NA)
358+
#' @param famID The new parent's family ID (default is NA)
327359
#' @return A single-row dataframe for the new parent
328360
addParentRow <- function(template_row, newID, sex,
329361
momID = NA,
330-
dadID = NA) {
362+
dadID = NA,
363+
famID = NA
364+
) {
331365
new_row <- template_row
332366
new_row[] <- NA # set all columns to NA
333367
new_row$ID <- newID
334-
new_row$momID <- NA
335-
new_row$dadID <- NA
368+
new_row$momID <- momID
369+
new_row$dadID <- dadID
336370
new_row$sex <- sex
371+
372+
if ("famID" %in% names(template_row)) {
373+
new_row$famID <- famID
374+
}
337375
# You can add more column initializations here if needed
376+
338377
return(new_row)
339378
}

man/addParentRow.Rd

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-checkParents.R

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ test_that("checksif single parents found correctly in ASOIAF dataset", {
2424
expect_equal(single_dads, length(results$missing_mothers))
2525
repaired_df <- checkParentIDs(df_asoiaf, verbose = FALSE, repair = TRUE, parentswithoutrow = TRUE)
2626
expect_equal(nrow(repaired_df), nrow(df_asoiaf) + single_moms + single_dads)
27+
28+
29+
repaired_phantoms <- checkParentIDs(df_asoiaf, verbose = FALSE, repair = TRUE, addphantoms = TRUE)
30+
expect_equal(nrow(repaired_phantoms), nrow(df_asoiaf) + single_moms + single_dads)
31+
# did it add more famIDs?
32+
expect_true(length(repaired_phantoms$famID[!is.na(repaired_phantoms$famID)]) > length(df_asoiaf$famID[!is.na(df_asoiaf$famID)]))
33+
# do the original famIDs remain unique?
34+
expect_true(length(unique(repaired_phantoms$famID[!is.na(repaired_phantoms$famID)])) == length(unique(df_asoiaf$famID[!is.na(df_asoiaf$famID)])))
35+
2736
})
2837

2938
test_that("verbose checks", {

0 commit comments

Comments
 (0)