Удалить строки после отрицательного значения в нескольких фреймах данных - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть несколько фреймов данных, которые представляют собой отдельные последовательности, состоящие из одних и тех же столбцов.Мне нужно удалить все строки после того, как отрицательное значение встречается в столбце «OnsetTime».Так что не строка самого отрицательного значения, а строка после этого.Все последовательности имеют 16 строк.Я думаю, что это должно выполняться циклом, но у меня нет опыта работы с циклами в r, и у меня есть 499 фреймов данных, из которых я в настоящее время удаляю строки последовательности по очереди, например:

sequence_6 <- sequence_6[-c(11:16), ]
sequence_7 <- sequence_7[-c(11:16), ]
sequence_9 <- sequence_9[-c(6:16), ]

Есть ли более быстрый способ сделать это?Пример последовательности можно увидеть здесь пример последовательности В этом примере я хочу удалить строку 7 в строку 16

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Данные

Поскольку странная веб-конфигурация на работе не позволяет мне получить доступ к вашим данным, я создал три кадра данных на основе случайных чисел

set.seed(123); data_1 <- data.frame( value = runif(25, min = -0.1) )
set.seed(234); data_2 <- data.frame( value = runif(20, min = -0.1) )
set.seed(345); data_3 <- data.frame( value = runif(30, min = -0.1) )

Сначала вы можете создать список, содержащий всеваши фреймы данных:

list_df <- list(data_1, data_2, data_3)

Теперь вы можете просмотреть этот список с помощью цикла for.Поскольку есть несколько шагов, я нахожу удобным использовать пакет dplyr, поскольку он допускает более удобочитаемую запись:

library(dplyr)

for( i in 1:length(list_df) ){

  min_row <- 
    list_df[[i]] %>%        
    mutate( id = row_number() ) %>% # add a column with row number 
    filter(value < 0) %>%           # get the rows with negative values
    summarise( min(id) ) %>%        # get the first row number 
    as.numeric()                    # transform this value to a scalar (not a dataframe)

  list_df[[i]] <- list_df[[i]] %>% slice(1:min_row) # get rows 1 to min_row 
}

Надеюсь, это поможет!

0 голосов
/ 18 декабря 2018

Мы можем получить наборы данных в list, предполагая, что имена объектов начинаются с 'sequence', за которыми следует - и одна или несколько цифр.Затем используйте lapply для циклического перебора list и поднабора строк на основе условия

lst1 <- lapply(mget(ls(pattern="^sequence_\\d+$")), function(x) {
          i1 <- Reduce(`|`, lapply(x, `<`, 0))
          #or use rowSums
          #i1 <- rowSums(x < 0) > 0
          i2 <- which(i1)[1]
          x[seq(i2),]
       }
      )

data

set.seed(42)
sequence_6 <- as.data.frame(matrix(sample(-1:10, 16 *5, replace = TRUE), nrow = 16))
sequence_7 <-  as.data.frame(matrix(sample(-2:10, 16 *5, replace = TRUE), nrow = 16))
sequence_9 <- as.data.frame(matrix(sample(-2:10, 16 *5, replace = TRUE), nrow = 16))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...