在迭代R中的数据帧时,如何引用上一行/下一行?

时间:2014-11-11 23:59:09

标签: r

我有一个看起来像这样的数据集(我在这里略微简化):

第1列的用户ID为 第2列有一个网址标题
第3列有一个实际的网址

数据已按用户和时间排序。所以它的用户1和他们按时间升序访问的所有URL,然后用户2和他们按时间升序等访问的URL等等

我想要做的是循环数据集并寻找"三胞胎"第一行网址不包含我的关键字(比如google或facebook或nytimes等),第二行网址包含我的关键字,第三行不包含我的关键字。基本上检查用户在任何特定网站之前和之后访问过的网站。

我发现我可以使用以下方式查找关键字:

if(length(grep("facebook",url)) > 0)

但我还没有能够弄清楚如何遍历代码并实现我想要做的事情。

如果你能将你的回答分成两部分,我真的很感激:

第1部分:有没有办法循环访问数据框并可以访问所有列?我能够使用以下代码处理单个列:

 new_data <- data.frame (url)

 for (url in data$url)
    if(length(grep("keyword",url)) > 0) {
     new_data <- rbind(new_data,data.frame(url = url))
   }

这种方法有限,因为我只能引用数据框中的单个列。什么是更好的解决方案?我试过了:

  • for(数据中的行)然后按行[column_number]和行[&#39; column_name&#39;]引用列无效
  • 我也尝试过(i in 1:nrow(data))然后使用数据[i,column_number]引用列,并且它们也没有工作(那应该工作正常吗?)我想是否这个方法我可以使用i-1和i + 1来访问其他行!我知道这不是R中传统的做事方式,但如果你仍然可以用这种方式提供解释,我会非常感激。

第2部分:如前所述,我如何实现我的实际目标?我想学习这样做&#34; R方式&#34 ;;我想它会涉及到plyr或lapply,但即使经过大量阅读,我也无法弄清楚如何使用这些函数,更不用说使用它们并包含对上一行/下一行的引用。

在此先感谢您的帮助,我们非常感谢您的指导!

1 个答案:

答案 0 :(得分:0)

使用[-1]

last <- nrow(df)
penu <- nrow(df) - 1

df$ContainsKeyword <- FALSE
df$ContainsKeyword[grep("keyword", df$url)] <- TRUE
df$TripletFound <- NA
   for (i in 2:penu){
     df$TripletFound[i] <- {df$ContainsKeyword[i-1] & df$ContainsKeyword[i+1]} & {!df$ContainsKeyword[i]}

   }