首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RStudio/ R-为列中的值与字符串完全匹配的行创建新的df (需要更快的速度)

RStudio/ R-为列中的值与字符串完全匹配的行创建新的df (需要更快的速度)
EN

Stack Overflow用户
提问于 2020-06-04 12:26:08
回答 2查看 68关注 0票数 0

对不起,我一直在寻找解决办法,但却找不到需要的东西。我对R非常陌生,以前只使用了matlab (因此我仍在试图不使用循环)。

我有一个df,里面有学术论文(每篇论文一排)。

主df

代码语言:javascript
复制
Fields                              Date       Title
Biology; Neuroscience               2016       How do we know when XXX
Music; Engineering; Art             2011       Can we get the XXX
Biotechnology; Biology & Chemistry  2007       When will we find XXX
History; Biology                    2006       Where does the XXXX

在一列(“字段”)中有一个主题名称列表,其中多个字段由一个冒号分隔。我想找到所有的行(论文)有一个与特定的字段名完全匹配(例如,‘生物学’)。然后,用所有这些行(论文)创建一个新的df。然而,重要的是,我不想得到部分匹配的字段(例如,“生物学与化学”)。

新df -只适用于那些行

代码语言:javascript
复制
Fields                              Date       Title
Biology; Neuroscience               2016       How do we know when XXX
History; Biology                    2006       Where does the XXXX

也就是说,也不选择生物技术;生物与化学2007我们什么时候会发现XXX里面有“生物学”这个词

我的第一个想法是使用拆分字符串在自己的列中获取每个字段名,然后循环遍历每一列,使用该列查找与名称的确切匹配。因为有多达200列(字段名),这需要很长时间!找到和拉出所有的行要花一个小时的时间。显然我想要更快的东西。

我知道在R中你可以通过应用等来避免循环,但我想不出如何在这里使用它。

这就是当我将作者的名字分割成不同的列时的样子。

代码语言:javascript
复制
Field1        Field2                     Date       Title
Biology       Neuroscience               2016       How do we know when XXX

到目前为止,这是我的代码(注意:当我将名字分开时,它们前面有一个空格)。

代码语言:javascript
复制
# Get list of columns to cycle through (they all start with 'sA')
names <- data[,grep("^sA", colnames(data))]
collist <- colnames(names)
names[collist] <- sapply(names[collist],as.character)
collist <- collist[-1]


Loop to get new df from matching rows
for (l in 1:length(namesUniq$Names)) {
  namecurr <- namesUniq$Names[l]
  namecurrSP <- paste0(" ", namecurr)

  # Get data for that field
    dfall <- data[which(data$sA1 == namecurr), ]

  for (d in 1:length(collist)) {
    dcol <- collist[d]
    dfall <- rbind(dfall, data[which(data[, dcol] == namecurrSP), ])
    rm(dcol)
  }
  rm(d)

快速运行的东西将是非常有用的。谢谢你的帮助!

grepl不起作用-它牵扯其他部分匹配字符串(比如“生物学与化学”,而我只想要“生物学”)。

代码语言:javascript
复制
dfall <- subset(data, grepl(namecurr, Field, fixed = TRUE))

由于某些原因,当我这样做时,它不起作用(行工作,rows2不工作-它选择在df边界之外的行)

代码语言:javascript
复制
dfall <- rbind(data[rows, ], data[rows2, ])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-04 12:41:07

如果没有示例数据的dput,这里有一个可以使用的示例

数据

代码语言:javascript
复制
test <- c("Biology; Neuroscience","Music; Engineering; Art","Biotechnology; Biology & Chemistry","History; Biology")

代码:

代码语言:javascript
复制
test[sapply(strsplit(test,"; "), function(x) any(x=="Biology"))]

产出:

代码语言:javascript
复制
[1] "Biology; Neuroscience" "History; Biology"    
票数 1
EN

Stack Overflow用户

发布于 2020-06-04 14:47:59

不确定您将从主数据中提取多少个不同的子集,但是我想我会为您提供更多的@Daniel解决方案,并演示一个tidyverse解决方案。

您可以将其看作是一个Biology_df,方法是从所有行的Main_dffilter开始,在这些行中,在按分号和空格("; ")对Fields列进行str_split之后,就会有与Biology完全匹配的any片段。

代码语言:javascript
复制
library(dplyr)
library(stringr)
library(purrr)

Main_df
#>                               Fields Date                   Title
#> 1              Biology; Neuroscience 2016 How do we know when XXX
#> 2            Music; Engineering; Art 2011      Can we get the XXX
#> 3 Biotechnology; Biology & Chemistry 2007     Where does the XXXX
#> 4                   History; Biology 2006     Where does the XXXX

Biology_df <- 
  Main_df %>% 
    filter(str_split(Fields, "; ") %>% 
           map_lgl( ~ any(.x == "Biology")
                  )
           )

Biology_df
#>                  Fields Date                   Title
#> 1 Biology; Neuroscience 2016 How do we know when XXX
#> 2      History; Biology 2006     Where does the XXXX

基于您显示的数据片段

代码语言:javascript
复制
Fields <- c("Biology; Neuroscience","Music; Engineering; Art","Biotechnology; Biology & Chemistry","History; Biology")
Date <- c("2016", "2011", "2007", "2006")
Title <- c("How do we know when XXX", "Can we get the XXX", "Where does the XXXX", "Where does the XXXX")
Main_df <- data.frame(Fields, Date, Title)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62194553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档