如何在不依赖于R中Column的位置引用的情况下循环数据框的行

时间:2014-03-06 00:09:19

标签: r loops read.csv

如果“第5列”中的字符串包含在“第6列”中的较长字符串中,我已经想出如何在我的数据框上创建一个= TRUE的新列 - 我可以通过引用这些名称来实现我的专栏而不是使用[r,c]位置参考?

rows = NULL

for(i in 1:length(excptn1[,1]))
{
    rows[i] <- grepl(excptn1[i,5],excptn1[i,6], perl=TRUE)
}

作为程序员,我很担心将事物称为“第5列和第6列”......我想引用那些列中捕获的变量的名称,这样我就不依赖于我的源文件始终以相同的顺序排列列。此外,我可能会忘记该位置引用并在代码中添加一些导致位置引用稍后失败的内容...当您可以根据列的名称进行思考时(而不是它们在某一点上的特定顺序)时间)建立强大的生产强度代码要容易得多。

我在这个网站上发现了一个相关的问题,它使用了我想要避免的相同类型的位置引用...

How do I perform a function on each row of a data frame and have just one element of the output inserted as a new column in that row

虽然R看起来非常灵活,但似乎缺少可扩展的生产强度代码所需的许多功能......但我希望我错了,可以学习其他功能。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以通过两种方式按名称而不是索引来引用列:

rows[i] <- grepl(excptn1[i,"colname"],excptn1[i,"othercolname"], perl=TRUE)

rows[i] <- grepl(excptn1$colname[i],excptn1$othercolname[i], perl=TRUE)

最后,请注意大多数R程序员都这样做:

rows = sapply(1:nrow(excptn), grepl(excptn1$colname[i],excptn1$othercolname[i], perl=TRUE))

这避免了在每次迭代中增加向量大小的开销。

答案 1 :(得分:0)

如果您想更快地执行此操作,请使用stri_match_first_regex包中的stringi功能。

示例:

require(stringi)
  

ramka&lt; - data.frame(foo = letters [1:3],bar = c(“ala”,“ma”,“koteczka”))

> ramka
  foo      bar
1   a      ala
2   b       ma
3   c koteczka

> stri_match_first_regex(str=ramka$bar, pattern=ramka$foo)
     [,1]
[1,] "a" 
[2,] NA  
[3,] "c"