0

如果“第 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 列”感到紧张......我想引用这些列中捕获的变量的名称,这样我就不必依赖我的源文件总是有列的顺序相同。此外,我可能会忘记该位置引用,并在代码的前面添加一些导致位置引用稍后失败的内容......当您可以考虑一般列的名称(而不是它们在某个点的特定顺序时间)构建强大的生产强度代码要容易得多。

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

如何在数据框的每一行上执行一个函数,并且只在该行中插入一个输出元素作为新列

虽然 R 看起来确实非常灵活,但它似乎缺少很多你想要的可扩展、生产强度代码的特性……但我希望我错了,可以学习其他方法。

谢谢!

4

2 回答 2

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))

这样可以避免的一件事是在每次迭代中增加向量大小的开销。

于 2014-03-06T00:16:50.850 回答
0

如果您想更快地执行此操作,请使用package.json 中stri_match_first_regex的函数stringi

例子:

require(stringi)

ramka <- 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" 
于 2014-03-06T07:50:10.153 回答