R 仅保留具有特定字符串的行上方的行

R 仅保留具有特定字符串的行上方的行,r,tidyverse,R,Tidyverse,我是新来的,所以要友善:) 我在R中使用tidyverse包 我有一个数据帧列表。在每个数据帧中,我只想在第一列中保留第一行上方的行,该行具有特定字符串(在本例中为三个星号)。在所附的示例中,我希望保留第21行上方的所有行(即第一列中第一次遇到“***”)。我该怎么做 这里有一种方法可以通过dplyr中的filter实现。基本上,您正在查找列循环中“***”与grepl的匹配项。这将为您提供一个逻辑向量。在我的示例中,FALSE,FALSE,FALSE,TRUE,TRUE。在此向量上使用cums

我是新来的,所以要友善:)

我在R中使用tidyverse包

我有一个数据帧列表。在每个数据帧中,我只想在第一列中保留第一行上方的行,该行具有特定字符串(在本例中为三个星号)。在所附的示例中,我希望保留第21行上方的所有行(即第一列中第一次遇到“***”)。我该怎么做


这里有一种方法可以通过
dplyr
中的
filter
实现。基本上,您正在查找列循环中“***”与
grepl
的匹配项。这将为您提供一个逻辑向量。在我的示例中,
FALSE,FALSE,FALSE,TRUE,TRUE
。在此向量上使用
cumsum
,它将保持为0(FALSE),直到满足第一个TRUE(1)。然后,您可以
过滤
,只保留0

df <- data.frame(cycle = c(1:3,"***","***"),value=1:5,stringsAsFactors = FALSE) 
df%>%
  filter(cumsum(grepl("***",cycle,fixed=TRUE))<1)

  cycle value
1     1     1
2     2     2
3     3     3
df%

filter(cumsum(grepl(“***”,cycle,fixed=TRUE))我不知道
tidyverse
包含的函数正好适合这个函数,但是base R可以处理它(因此它可以包含在管道中)

一些样本数据:

dat <- data.frame(Cycle = c(1:5,20,"***",21,22),
                  Time  = Sys.time() + 1:9,
                  stringsAsFactors = FALSE)
dat
#   Cycle                Time
# 1     1 2017-06-26 14:02:48
# 2     2 2017-06-26 14:02:49
# 3     3 2017-06-26 14:02:50
# 4     4 2017-06-26 14:02:51
# 5     5 2017-06-26 14:02:52
# 6    20 2017-06-26 14:02:53
# 7   *** 2017-06-26 14:02:54
# 8    21 2017-06-26 14:02:55
# 9    22 2017-06-26 14:02:56


dat[! cumany(grepl("\\*\\*\\*", dat$Cycle)),]
#   Cycle                Time
# 1     1 2017-06-26 14:02:48
# 2     2 2017-06-26 14:02:49
# 3     3 2017-06-26 14:02:50
# 4     4 2017-06-26 14:02:51
# 5     5 2017-06-26 14:02:52
# 6    20 2017-06-26 14:02:53
因此,它可以很容易地插入到
%%>%%
管道中:

library(dplyr)
dat %>%
  filter(! cumany(grepl("***", Cycle, fixed = TRUE)))

对于显示的数据,这就足够了。如果
$Cycle
中的值存在任何歧义,您可能应该使用更具弹性的模式来匹配截止值。

请包含样本数据,而不是样本数据的图像。可能
dput(许多_文件[[1]][c(1:5,20:23),]))
可以在这里使用。我该怎么做?例如,导出数据框,以便将其附加到此处?请查看和帮助页面,我的第一条评论特别使用了其中一条建议。(这里的一个关键点是,它应该是您数据中最小但具有代表性的部分。如果我必须滚动浏览原始数据页面,您很可能做错了(您经常会被忽略为“太多的努力”)。您以8秒的优势击败了我:-)谢谢。那么我如何将其应用到列表中的所有数据帧?搜索
[r]函数列表dataframes
,有许多问题讨论如何处理
数据。frame
s在
列表中。好的,看了一下,但找不到我想要的答案。基本上我面临的问题是“filter”不能用于列表。也许我应该使用“map”?但无法找到正确的语法rk.
多个文件怎么样谢谢。一位朋友建议:多个文件
library(dplyr)
dat %>%
  filter(! cumany(grepl("***", Cycle, fixed = TRUE)))