如果后面有另一个单元格匹配,则查找单元格匹配

时间:2019-12-29 18:02:52

标签: r

我有一个数据框,它是使用pdftools从PDF转换成的会议成绩单的列表,其中包含一系列看起来像这样的未嵌套单词:

document_id <- c("BOARD19810203meeting.pdf", "BOARD19810405meeting.pdf", "BOARD19810609meeting.pdf", "BOARD19810405meeting.pdf", "BOARD19810609meeting.pdf")

word <- c("leave", "tomorrow", "for", "first", meeting")

df <- data.frame(document_id, word)

我想编写一个代码,该代码汇总一个单词出现的次数,前提是该单词后面紧跟另一个单词的出现日期。使用上面的示例,我想计算出“明天离开”出现的次数(即,如果明天之后则计算离开)。因此,最终输出将如下所示:

date <- c("1981-02-03", "1982-08-09", "1991-04-04", "1991-07-04")

word <- c("leave", "leave", "leave", "leave")

df <- data.frame(date, word)

我编写了以下代码来汇总其中一项:

leave_in_transcripts <- select(interview_transcripts, 1:3) %>% filter(grepl("leave", word, ignore.case=TRUE)|(grepl("tomorrow", word, ignore.case=TRUE))

leave_in_transcripts$word <- str_count(leave_in_transcripts$word, 'leave')

count_leave <- aggregate(leave_in_transcripts['word'], by = list(Group.date = leave_in_transcripts$date), sum, na.rm=T)

但是显然,即使后面跟着另一个单词,这也算是休假。

我已经搜索了一段时间,我不知道该怎么做。有什么想法吗?

在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

通过创建具有当前行和下一行(lead)和sum逻辑向量的逻辑表达式,我们可以计算出'leave'之后是'tomorrow'的实例数

library(dplyr)
library(stringr)
df %>%
 summarise(Sum = sum(str_detect(word, 'leave') &
         str_detect(lead(word), 'tomorrow'), na.rm = TRUE))

答案 1 :(得分:1)

感谢@akrun回答这个问题。 对于其他阅读本书的人,我还编写了代码,以根据Akrun的代码按日期汇总单词出现的实例:

leave_in_transcripts <- df %>% mutate(match = str_detect(word, 'leave') & str_detect(lead(word), 'tomorrow'))

leave_in_transcripts <- select(leave_in_transcripts, 1:4) %>% filter(match == "TRUE")

leave_in_transcripts$match <- str_count(leave_in_transcripts$match, 'TRUE')

count_leave <- aggregate(leave_in_transcripts['match'], by = list(Group.date = leave_in_transcripts$date), sum, na.rm=T)

答案 2 :(得分:1)

在基数R中,我们可以使用headtail来匹配当前行和下一行的值。我们可以subset匹配条件的行,并使用as.Date将数据从document_id转换为日期对象,并给出适当的格式。另外,由于您要测试完全匹配而不是部分匹配,因此最好使用==而不是grepl

transform(subset(df, c(head(word, -1) == "leave" & 
                       tail(word, -1) == "tomorrow", FALSE)), 
                 date = as.Date(document_id,"BOARD%Y%m%dmeeting.pdf"))

#               document_id  word       date
#1 BOARD19810203meeting.pdf leave 1981-02-03

如果您只想计算满足上述条件的次数,我们可以使用sum

with(df, sum(head(word, -1) == "leave" & tail(word, -1) == "tomorrow"))