我有多个数据帧,这些数据帧是单独的序列,由相同的列组成。在“ 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行
答案 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
}
希望有帮助!