r - 如果满足条件并且字符串值包含在字符向量中,则在 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)
}
解决方案
你可以试试 -
#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>
推荐阅读
- uwp - FileInformationFactory GetVirtualizedItemsVector() 在 UWP 中更改文件夹名称时不更新文件路径
- css - 如何在角度通用或 SSR 上全局设置视图封装
- python - 使用手动设置的规范/限制获取颜色图的颜色元组?
- java - 为什么 SwitchCompat 不能在 Android Studio 上运行?
- c++ - 如何根据编译器指令 -D 自动选择 include.h 文件?
- javascript - 如何从元素中删除 EventListener(就像 chrome 一样)
- c - 如何返回一个数组并在 main() 中打印它?
- java - 如何使用自上而下的 Web 服务?
- javascript - 如何在没有时区偏移的情况下即时输出日期/时间
- c# - WebClient 需要 43 秒来下载这个 json 字符串 https://jsonplaceholder.typicode.com/posts