@@ -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
0 commit comments