在整个列的data.frame列中获取向量的第n个元素 - R

时间:2016-02-25 08:01:56

标签: r vector dataframe

我有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中的整个列执行此操作。我想我可以通过创建一个循环来实现它,但我的问题是,如果有一种方法可以在没有循环的情况下完成它。可悲的是,我无法理解这一点。

3 个答案:

答案 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复杂的东西,你可能会得到相当可怕的正则表达式模式,但在这种简单的情况下,我更喜欢保持代码紧凑而不加载其他包。