Как я могу удалить отдельные значения в строке по условию в R? - PullRequest
2 голосов
/ 19 июня 2020

Предположим, у меня есть следующая матрица:

      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
...

Теперь я хотел бы хранить строки при определенных условиях. Например, я хотел бы сохранить первую строку без нулей, а вторую строку без значений ниже нуля или нуля:

c(-100,10,10,120)    #Row 1 
 -100   10   10  120
c(30,20,130)         #Row 2
 30  20 130

Как я могу это сделать? Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Допустим, ваша матрица:

mat = cbind(c(-100,-200,-250),c(0,0,20),
c(10,30,0),c(0,20,0),c(10,0,0),c(120,130,280))

Тогда вы получите список:

store_vals = apply(mat,1,function(i)i[i!=0])

Каждый элемент соответствует каждой строке, если вы хотите сохранить row1 как вектор:

row1 = store_vals[[1]]
row1
[1] -100   10   10  120
1 голос
/ 20 июня 2020

Я опаздываю к этому, но вот еще одно решение, которое будет работать с 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

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