在多个数据框中删除负值之后的行

时间:2018-12-18 09:50:51

标签: r loops dataframe row sequence

我有多个数据帧,这些数据帧是单独的序列,由相同的列组成。在“ 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), ]

有更快的方法吗?可以在这里example sequence看到一个序列示例 在这个例子中,我要删除第7行到第16行

2 个答案:

答案 0 :(得分:0)

我们可以将数据集放入list中,假设对象名称以“序列”开头,后跟-和一个或多个数字。然后使用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),]
       }
      )

数据

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

答案 1 :(得分:0)

数据

由于工作中奇怪的Web配置阻止我访问您的数据,因此我基于随机数创建了三个数据框

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 
}

希望有帮助!