对不起,我一直在寻找解决办法,但却找不到需要的东西。我对R非常陌生,以前只使用了matlab (因此我仍在试图不使用循环)。
我有一个df,里面有学术论文(每篇论文一排)。
主df
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 -只适用于那些行
Fields Date Title
Biology; Neuroscience 2016 How do we know when XXX
History; Biology 2006 Where does the XXXX也就是说,也不选择生物技术;生物与化学2007我们什么时候会发现XXX里面有“生物学”这个词
我的第一个想法是使用拆分字符串在自己的列中获取每个字段名,然后循环遍历每一列,使用该列查找与名称的确切匹配。因为有多达200列(字段名),这需要很长时间!找到和拉出所有的行要花一个小时的时间。显然我想要更快的东西。
我知道在R中你可以通过应用等来避免循环,但我想不出如何在这里使用它。
这就是当我将作者的名字分割成不同的列时的样子。
Field1 Field2 Date Title
Biology Neuroscience 2016 How do we know when XXX到目前为止,这是我的代码(注意:当我将名字分开时,它们前面有一个空格)。
# 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不起作用-它牵扯其他部分匹配字符串(比如“生物学与化学”,而我只想要“生物学”)。
dfall <- subset(data, grepl(namecurr, Field, fixed = TRUE))由于某些原因,当我这样做时,它不起作用(行工作,rows2不工作-它选择在df边界之外的行)
dfall <- rbind(data[rows, ], data[rows2, ])发布于 2020-06-04 12:41:07
如果没有示例数据的dput,这里有一个可以使用的示例
数据
test <- c("Biology; Neuroscience","Music; Engineering; Art","Biotechnology; Biology & Chemistry","History; Biology")代码:
test[sapply(strsplit(test,"; "), function(x) any(x=="Biology"))]产出:
[1] "Biology; Neuroscience" "History; Biology" 发布于 2020-06-04 14:47:59
不确定您将从主数据中提取多少个不同的子集,但是我想我会为您提供更多的@Daniel解决方案,并演示一个tidyverse解决方案。
您可以将其看作是一个Biology_df,方法是从所有行的Main_df和filter开始,在这些行中,在按分号和空格("; ")对Fields列进行str_split之后,就会有与Biology完全匹配的any片段。
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基于您显示的数据片段
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)https://stackoverflow.com/questions/62194553
复制相似问题