Я опаздываю к этому, но вот еще одно решение, которое будет работать с data.frame
s и матрицами и будет принимать любые общие условия выбора c для фильтрации значений. Сам выбор выполняется путем оценки eval(parse(value, selection_condition))
и затем фильтрации всех тех, которые оцениваются как TRUE
. Затем для циклического перебора строк (например, a data.frame
) эту функцию (selcol()
) можно вызвать из for loop
, и ее результаты сохранятся в списке, как показано ниже:
#----
#Function to select columns based on arbitrary condition(s)
selcols <- function(myinp, mycond){
#In theory, the user can pass whatever
#equivalency conditions they want
#This is just some (un)necessary checking
#that has been commented out
#if( grepl("^[\\-]{0,1}[0-9]+", mycond, perl = TRUE) ){
# mycond <- paste0("== ", mycond)
#} else if( grepl("^>[=]*[0-9]+|^<[=]*[0-9]+", mycond, perl = TRUE) ){
# mycond <- mycond
#} else{
# stop("Unable to parse selection condition! Check the input!")
#}
#Parse the equivalency conditions
#and assign NAs accordingly
myout <- unlist(
lapply(as.vector(myinp),
function(x){
ifelse(eval(parse(text = paste0(x, mycond))), NA, x)}))
#Return vector of values excluding the NAs
return(myout[!is.na(myout)])
}
#----
#----
#Your data
df <- " 2020-01-01 2021-01-01 2022-01-01 2022-06-06 2022-09-01 2025-01-0
[1,] -100 0 10 0 10 120
[2,] -200 0 30 20 0 130
[3,] -250 20 0 0 0 280"
df <- as.matrix(read.table(text = df))
#----
#Example runs
#Filter out all zeroes
myl <- list()
for(i in 1:nrow(df)){
myl[[i]] <- selcols(df[i, ], "==0")
}
myl[[1]]
# [1] -100 10 10 120
#Filter out all values less than 0
myl <- list()
for(i in 1:nrow(df)){
myl[[i]] <- selcols(df[i, ], "<0")
}
myl[[1]]
# [1] 0 10 0 10 120
#----