我有多个数据帧,它们是独立的序列,由相同的列组成。在"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 Rag本例中,我想删除第7行到第16行
发布于 2018-12-18 21:29:52
数据
由于工作中奇怪的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
}希望它能帮上忙!
发布于 2018-12-18 17:54:05
我们可以将数据集放入序列中,假设对象名称以‘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))https://stackoverflow.com/questions/53830338
复制相似问题