仅使用特定字符串保留行上方的行

时间:2017-06-26 20:52:00

标签: r tidyverse

我是新手,所以请善待:)

我在R中使用了tidyverse包。

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

dataframe example

2 个答案:

答案 0 :(得分:2)

我不知道tidyverse包含恰当的函数,但基本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

您可以使用

使其看起来更具可读性
dat[! cumany(grepl("***", dat$Cycle, fixed = TRUE)),]

因此可以在%>%管道中轻松插入:

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

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

答案 1 :(得分:0)

以下是使用filter中的dplyr执行此操作的一种方法。基本上,您在列循环中查找“***”与grepl的匹配项。这将为您提供逻辑向量。在我的示例中,FALSE,FALSE,FALSE,TRUE, TRUE。在此向量上使用cumsum,它将保持为0(FALSE),直到它满足第一个TRUE(1)。然后你filter并且只保留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