Skip to content

Commit a3ea330

Browse files
committed
update filterNA(): add minCount
1 parent 0217544 commit a3ea330

2 files changed

Lines changed: 82 additions & 33 deletions

File tree

R/filtering.R

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -113,24 +113,30 @@ filterOutIn <- function(dataSet,
113113

114114
##------------------------------------------------------------------------------
115115
#'
116-
#' Filter proteins by non-missing proportion
116+
#' Filter proteins by non-missing proportion and/or count
117117
#'
118118
#' @description
119-
#' Remove proteins with NA values.
119+
#' Remove proteins with insufficient non-missing values based on a minimum
120+
#' non-missing proportion threshold, a minimum non-missing count threshold,
121+
#' or both.
120122
#'
121-
#' @param dataSet The 2d data set of experimental values.
123+
#' @param dataSet A data frame containing the data signals.
124+
#'
125+
#' @param minProp A numeric value (default = 0.51) specifying
126+
#' the minimum non-missing proportion required for a protein to be retained.
122127
#'
123-
#' @param minProp A numeric value (default = 0.51) specifying the minimum
124-
#' non-missing proportion required for a protein to be retained.
128+
#' @param minCount An integer specifying
129+
#' the minimum non-missing count required for a protein to be retained.
125130
#'
126131
#' @param by A character string (default = "cond") specifying
127-
#' how coverage is evaluated.
132+
#' how non-missingness is evaluated.
128133
#' \itemize{
129-
#' \item \code{"cond"}: The non-missing proportion for a protein must be
130-
#' at least \code{minProp} within each condition. Proteins failing in any
131-
#' condition are filtered out.
132-
#' \item \code{"all"}: The overall non-missing proportion across all samples
133-
#' must be at least \code{minProp}.
134+
#' \item \code{"cond"}: The non-missing proportion and/or count for a protein
135+
#' must meet the specified threshold (\code{minProp} and/or \code{minCount})
136+
#' within each condition. Proteins failing in any condition are filtered out.
137+
#' \item \code{"all"}: The overall non-missing proportion and/or count
138+
#' across all samples must meet the specified threshold (\code{minProp} and/or
139+
#' \code{minCount}).
134140
#' }
135141
#'
136142
#' @param saveRm A logical value (default = TRUE) specifying whether
@@ -139,9 +145,24 @@ filterOutIn <- function(dataSet,
139145
#' @return
140146
#' A filtered data frame.
141147
#'
148+
#' @details
149+
#' \itemize{
150+
#' \item If \code{minProp} is provided, proteins are filtered based on
151+
#' the non-missing proportion.
152+
#' \item If \code{minCount} is provided, proteins are filtered based on
153+
#' the non-missing count.
154+
#' \item If both are provided, both criteria must be satisfied.
155+
#' \item At least one of \code{minProp} and \code{minCount} must be specified.
156+
#' }
157+
#'
142158
#' @export
143159

144-
filterNA <- function(dataSet, minProp = 0.51, by = "cond", saveRm = TRUE) {
160+
filterNA <- function(dataSet, minProp = 0.51, minCount = NULL,
161+
by = "cond", saveRm = TRUE) {
162+
163+
if (is.null(minProp) && is.null(minCount)) {
164+
stop("At least one of 'minProp' and 'minCount' must be provided.")
165+
}
145166

146167
## 0/1 non-missing indicator: 1 present, 0 missing
147168
prot_cols <- setdiff(names(dataSet), c("R.Condition", "R.Replicate"))
@@ -155,12 +176,24 @@ filterNA <- function(dataSet, minProp = 0.51, by = "cond", saveRm = TRUE) {
155176
## non-missing counts per condition x protein
156177
nonmissing_n <- rowsum(nonmissing01, group = cond, reorder = FALSE)
157178
## samples per condition
158-
n_per_cond <- as.integer(table(cond))
159-
## non-missing proportion per condition x protein
160-
prop_nonmissing <- sweep(nonmissing_n, 1, n_per_cond, "/")
161-
keep <- colSums(prop_nonmissing < minProp) == 0
179+
n_per_cond <- as.integer(table(cond)[rownames(nonmissing_n)])
180+
keep <- rep(TRUE, ncol(nonmissing_n))
181+
if (!is.null(minProp)) {
182+
## non-missing proportion per condition x protein
183+
prop_nonmissing <- sweep(nonmissing_n, 1, n_per_cond, "/")
184+
keep <- keep & (colSums(prop_nonmissing < minProp) == 0)
185+
}
186+
if (!is.null(minCount)) {
187+
keep <- keep & (colSums(nonmissing_n < minCount) == 0)
188+
}
162189
} else {
163-
keep <- (colMeans(nonmissing01) >= minProp)
190+
keep <- rep(TRUE, ncol(nonmissing01))
191+
if (!is.null(minProp)) {
192+
keep <- keep & (colMeans(nonmissing01) >= minProp)
193+
}
194+
if (!is.null(minCount)) {
195+
keep <- keep & (colSums(nonmissing01) >= minCount)
196+
}
164197
}
165198

166199
keep_proteins <- prot_cols[keep]
@@ -172,19 +205,19 @@ filterNA <- function(dataSet, minProp = 0.51, by = "cond", saveRm = TRUE) {
172205
removedData <- dataSet[, c("R.Condition", "R.Replicate", drop_proteins), drop = FALSE]
173206

174207
information <- read.csv("preprocess_protein_information.csv", check.names = FALSE)
175-
scaffoldCheck <- any(colnames(information) == "Visible?")
176-
IDcol <- ifelse(scaffoldCheck, "AccessionNumber", "PG.ProteinName")
208+
scaffoldCheck <- "Visible?" %in% colnames(information)
209+
IDcol <- if (scaffoldCheck) "AccessionNumber" else "PG.ProteinName"
177210

178211
## save removed data to current working directory
179212
removedData_long <- removedData %>%
180-
pivot_longer(-c("R.Condition", "R.Replicate"), names_to = IDcol, values_to = "PG.Quantity") %>%
213+
pivot_longer(-c("R.Condition", "R.Replicate"),
214+
names_to = IDcol, values_to = "PG.Quantity") %>%
181215
left_join(information, by = IDcol)
182216

183217
write.xlsx(list(removedData, removedData_long), file = "filterNA.xlsx")
184218

185219
}
186220

187-
## return the filtered data
188221
return(filteredData)
189222
}
190223

man/filterNA.Rd

Lines changed: 28 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)