проверить ограничения для каждого столбца, передав строку - PullRequest
1 голос
/ 04 октября 2019

Применение ограничений для динамического числа столбцов

Я использую фрейм данных, в котором число столбцов может быть динамическим. Я хочу создать функцию для проверки ограничений (в основном, если каждое значение лежит между min и max, если дано) на данных. Я буду применять некоторые функции для комбинации строк, которые будут генерировать одну строку. Я хочу передать эту строку в функцию ограничения и проверить, находятся ли значения каждого столбца между min и max. Для этого я приведу матрицу ограничений, в которой имена столбцов будут такими же, как у основного фрейма данных, с первой строкой как min и второй как max. Некоторые столбцы могут иметь только мин или только макс. Если столбец является символьной строкой в ​​основном фрейме данных, то как минимальное, так и максимальное значение будет NA. Значения, не доступные, будут NA. Я хочу, чтобы функция возвращала TRUE, если все заданные ограничения выполнены, иначе FALSE. Если переданная строка имеет больше столбцов, чем матрица ограничений (столбцы, сгенерированные во время манипулирования данными), то следует проверять только столбцы, присутствующие в матрице ограничений. Я также хочу, чтобы функция была быстрой, и я пытаюсь использовать функции семейства применений, поскольку эта проверка будет выполняться много раз.

Я пробовал использовать функцию ifelse () и логические операторы, но ее нельзя было применить, есличисло столбцов и ограничений является динамическим.

# Function to Check Constraints
# df is a dataframe consisting of only one row on which constraints are to be checked
check_cons = function(df){
    df = c(df)
    return(ifelse( df$col1 > cons_col1_min, ifelse( df$col1 < cons_col1_max, ifelse( df$col2 > cons_col2_min, ifelse( df$col2 < cons_col2_max, ifelse( df$col3> cons_col3_min , ifelse( df$col3< cons_col3_max,T, F), F), F), F), F), F))    
}
# But this function cannot be used for dynamic number of constraints. 

То, что я пытаюсь сделать, будет примерно таким:

#Constraint Matrix
col1 col2 col3 col4 
4    7    NA   NA   
10   NA   17   NA

#I can have an input row like this
#Case 1:
col1 col2 col3 col4 
5    11    16   A   
# Passing this row should return values TRUE as it follows all the constraints
# col4 could have any max or min as both values not given and it is a character data
# col2 has a min constraint and col3 has a max constraint.

#Case 2:
col5 col1 col2 col3 col4
23   5    11    16   A  

# For this row constraints for col5 will not be checked as it is not given in the constraint matrix
# Positions of columns could be jumbled in the passed dataframe with one row
# This will also return the value as TRUE.

Пожалуйста, дайте мне знать любой типрешение, которое приходит вам на ум Примерное решение также будет очень полезно.

1 Ответ

1 голос
/ 04 октября 2019
check_cons<-function(inp,constr) { # allows you to define both the dataframe and the constraints
  constr<-constr[,!sapply(constr,function(x) all(is.na(x)))] # remove constraint columns that are all NA because they don't matter
  inp<-inp[,names(constr)] # remove columns that don't appear in the constraints matrix, and reorder the input according to the constraints
  all(inp>constr[1,], inp<constr[2,],na.rm=TRUE) # check the conditions
}

Вот аналогичное решение, которое принимает data.frames с более чем одной строкой и проверяет ограничения для каждого из них, используя apply, выводя вектор значений TRUE и FALSE:

check_cons<-function(inp,constr) {
  constr<-constr[,!sapply(constr,function(x) all(is.na(x)))]
  inp<-inp[,names(constr)]
  suppressWarnings(apply(inp, 1, function(inp) all(inp>constr[1,], inp<constr[2,],na.rm=TRUE)))
}

(Обратите внимание, что использование apply преобразует data.frame в матрицу, и в этом случае, если какой-либо из столбцов является символьным классом, ВСЕ столбцы станут символьными. Поэтому я удалил из ограничений столбцы, содержащие только NA. , вы можете использовать «as.numeric» перед аргументами inp выше apply.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...