我有一个包含URls的列的数据框,如下所示:
https://www.facebook.com/nameofpage/posts/13142894231
我试图只将此列的nameofpage
部分提取到一个新列中。我无法弄清楚如何在那个确切的位置提取字符串。该字符串有时包含文字“。”,文本和数字。
我一直试图使用来自tidyr的strsplit
和separate
,但收效甚微。
tidyr代码如下所示:
separate(Link, c(NA, NA, NA, "target"), sep = "/")
但是,这根本不起作用。
我希望将nameofpage
提取到列中,但有时输出实际上是URL的另一部分。
此外还有str_match
,它将在正则表达式中返回匹配的组:
str_match(url, "://(.*?)/(.*?)(\/|$)")[,2]
你可以使用str_split
包中的stringr
。
URL = "https://www.facebook.com/nameofpage/posts/13142894231"
library(stringr)
str_split(URL, "/")
[[1]]
[1] "https:" "" "www.facebook.com" "nameofpage"
[5] "posts" "13142894231"
str_split(URL, "/")[[1]][4]
[1] "nameofpage"
您可以编写自定义函数来处理字符串:
get.nameofpage = function(string){
(unlist(strsplit(string, "\\/")))[4]
}
# Example
my.string = "https://www.facebook.com/nameofpage/posts/13142894231"
> get.nameofpage(my.string)
[1] "nameofpage"
你可以使用gsub
。这将在.com之后返回至少一个+
字符,该字符不是正斜杠[^/]
:
link <- "https://www.facebook.com/nameofpage/posts/13142894231"
gsub("^.*\\.com/([^/]+).*", "\\1", link)
[1] "nameofpage"
注意:这只适用于带有“.com”的网址(即,它不适用于其他域.edu,.org等)
关于我们对所需字段的位置的确切知识存在一些疑问,但如果我们知道它是第4个/分隔字段或者从最后开始第3个字符,我们可以分别使用(1)或(2)。 (如果这些都不能被假设,请详细说明我们如何知道所需的字段。)
1)read.table使用下面注释中的字符向量ss
作为输入,如果我们知道所需字段在第三个和第四个斜杠之间,我们可以使用read.table
。
read.table(text = ss, sep = "/", fill = TRUE, as.is = TRUE)[[4]]
## [1] "nameofpage" "nameofpage"
1a)使用separate
:
library(tidyr)
separate(data.frame(ss), ss, c(NA, NA, NA, "target"), sep = "/", extra = "drop")
## target
## 1 nameofpage
## 2 nameofpage
2)dirname / basement如果我们知道所需的字段是过去的第三个字段,我们可以使用dirname
和basename
:
basename(dirname(dirname(ss)))
## [1] "nameofpage" "nameofpage"
s <- "https://www.facebook.com/nameofpage/posts/13142894231"
ss <- c(s, s)