我有data.frame
名为ga.topPages
>ga.topPages
pagePath pageTitle pageviews
1 /meine-inhalte/2 Übersichtsseite 4986
2 /mein-profil/1 Mein Profil 805
3 /meine-nachrichten Meine Nachrichten 661
4 /app.html Login 531
5 / Login 420
我希望从列pagePath
获得" /" s之间的第一个元素。使用strsplit
我创建一个辅助列:
ga.topPages$temp1 <- strsplit(ga.topPages$pagePath,"/")
因此,列temp1是对象的矢量:
> head(ga.topPages$temp1, 1)
[[1]]
[1] "" "meine-inhalte" "2"
如上所述,我只需要获取此向量的第n个元素。我可以通过定义以下函数来单独获取此元素(f.i.,在下面的示例中,我得到第一个观察的第二个元素):
(function(x){ga.topPages$temp1[[x]][2]})(1)
我想为data.frame中的整个列执行此操作。我想我可以通过创建一个循环来实现它,但我的问题是,如果有一种方法可以在没有循环的情况下完成它。可悲的是,我无法理解这一点。
答案 0 :(得分:4)
更新:使用 stringi 包中的stri_extract_first
,您可以执行以下操作:
library(stringi)
mydf$temp1 <- stri_extract_first(mydf$pagePath, regex='[^/]+')
给出:
> mydf
pagePath pageTitle pageviews temp1
1 /meine-inhalte/2 Übersichtsseite 4986 meine-inhalte
2 /mein-profil/1 MeinProfil 805 mein-profil
3 /meine-nachrichten MeineNachrichten 661 meine-nachrichten
4 /app.html Login 531 app.html
5 / Login 420 <NA>
旧答案:首先删除带有"/"
的第一个gsub("^/","",mydf$pagePath)
,然后您可以使用 stingi中的stri_split_fixed
结尾 package获取第一个元素:
library(stringi)
mydf$temp1 <- stri_split_fixed(gsub("^/","",mydf$pagePath), "/", n=1, tokens_only=TRUE)
给出:
> mydf
pagePath pageTitle pageviews temp1
1 /meine-inhalte/2 Übersichtsseite 4986 meine-inhalte
2 /mein-profil/1 MeinProfil 805 mein-profil
3 /meine-nachrichten MeineNachrichten 661 meine-nachrichten
4 /app.html Login 531 app.html
5 / Login 420
答案 1 :(得分:3)
以下是我对此的看法:
vec <- c("/meine-inhalte/2", "/mein-profil/1", "/meine-nachrichten", "/app.html", "/")
sapply(vec, function(x) ifelse(grepl("/", x), unlist(strsplit(x, "/"))[2], x), USE.NAMES=F)
[1] "meine-inhalte" "mein-profil" "meine-nachrichten" "app.html" NA
声明它始终首先出现“/”,表示它始终是strsplit()
输出的第二个元素。所有这些都需要处理 - 没有“/”的情况。
根据你只想用“/”处理的情况,你可以用空字符串替换NA。
答案 2 :(得分:3)
当我需要进行字符串提取或替换
时,sub
通常只为我做这项工作
> sub("^/([^/]+).*", "\\1", vec)
[1] "meine-inhalte" "mein-profil" "meine-nachrichten" "app.html" "/"
如果你使用sub
复杂的东西,你可能会得到相当可怕的正则表达式模式,但在这种简单的情况下,我更喜欢保持代码紧凑而不加载其他包。