我是新手,所以请善待:)
我在R中使用了tidyverse包。
我有一个数据框列表。在每个数据帧中,我想只保留第一行上方的行,该行在其第一列中具有特定字符串(在本例中为三个星号)。在附加的示例中,我想保留第21行上方的所有行(即第一次" ***"在第一列中遇到)。我该怎么做?
答案 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