首页 > 解决方案 > 如果满足条件并且字符串值包含在字符向量中,则在 R 中循环遍历行,将新列值设置为字符向量元素

问题描述

我有一个文件路径的字符向量,其中始终包含公司的名称。我还有一个数据框,其中包含公司名称的列。

我希望能够首先检查该行是否在 df$style_name 列中包含值“Title”。然后我想看看数据框中的公司名称是否在字符向量的文件路径中。

如果是这样,分配一个新列 df$record 以包含相应的文件路径。

这是字符向量。

filenames <- list.files(path = dir, pattern = "*.docx|*.DOCX", full.names = TRUE)
> filenames
[1] "C:/Temp/data/D21 248694  Company Data - ABC Co - August 2021.DOCX"                            
[2] "C:/Temp/data/D21 248706  Company Data – XYZ Limited – September 2021.DOCX"

我目前拥有的数据框。

样式名称 文本 记录
标题 ABC公司 不适用
列表项目符号 胡说八道 不适用
列表项目符号 胡说八道 不适用
标题 XYZ 有限公司 不适用
列表项目符号 胡说八道 不适用

我追求的数据框。

样式名称 文本 记录
标题 ABC公司 C:/Temp/data/D21 248694 公司数据 - ABC Co - 2021 年 8 月.DOCX
列表项目符号 胡说八道 不适用
列表项目符号 胡说八道 不适用
标题 XYZ 有限公司 C:/Temp/data/D21 248706 公司数据 – XYZ Limited – 2021 年 9 月.DOCX
列表项目符号 胡说八道 不适用

这是我目前的代码,我认为 for 循环是错误的,因为它只填充与向量中最后一个文件路径匹配的最后一行。

  for (file in filenames) {
       df$record <- ifelse((df$style_name == 'Title' & str_detect(tolower(file),tolower(df$text))), file, NA)
  }

标签: rstringfor-loop

解决方案


你可以试试 -

#Initialise record column to NA
df$record <- NA
#get the row numbers where style_name is 'Title'
inds <- which(df$style_name == 'Title')
#For each index find the corresponding filenames which matches.
for(i in inds) {
  val <- grep(df$text[i], filenames, value = TRUE)
  if(length(val)) df$record[i] <- val[1]
}
df

#   style_name        text                                                                    record
#1       Title      ABC Co         C:/Temp/data/D21 248694  Company Data - ABC Co - August 2021.DOCX
#2 List Bullet   blah blah                                                                      <NA>
#3 List Bullet   blah blah                                                                      <NA>
#4       Title XYZ Limited C:/Temp/data/D21 248706  Company Data – XYZ Limited – September 2021.DOCX
#5 List Bullet   blah blah                                                                      <NA>

推荐阅读