【发布时间】:2015-06-13 23:34:25
【问题描述】:
我有一个包含 22k 条记录和 6 列的营销数据数据框,其中 2 列是感兴趣的。
- 变量
- FO.variable
这是数据帧样本的 dput 输出的链接:http://dpaste.com/2SJ6DPX
如果有更好的方法来分享这些数据,请告诉我。
我要做的就是创建一个额外的二进制保留列,它应该是:
- 1 如果 FO.variable 在变量内部
- 0 如果 FO.Variable 不在变量中
似乎是一件简单的事情...在 Excel 中,我只需添加带有“if”公式的另一列,然后将公式粘贴下来。我花了过去几个小时试图得到这个和 R 并且失败了。
这是我尝试过的:
使用 grepl 进行模式匹配。我以前使用过 grepl ,但这次我试图传递一列而不是字符串。我早期的尝试失败了,因为我试图强制 grepl 和 ifelse 导致 grepl 使用列中的第一个值而不是整个值。
-
我的下一个尝试是根据 SO 上的另一篇文章使用 transform 和 grep。我不认为这会给我确切的答案,但我认为它会让我足够接近,让我从那里弄清楚......代码运行了一段时间而不是因为下标无效而出错。
transform(dd, Keep = FO.variable[sapply(variable, grep, FO.variable)]) -
我的下一个尝试是使用 str_detect,但我认为这不是正确的方法,因为我想要行级别的值,而且我认为“any”会使用向量中的任何值?
kk <- sapply(dd$variable, function(x) any(sapply(dd$FO.variable, str_detect, string = x))) 编辑:刚刚尝试了一个 for 循环。我更喜欢矢量化方法,但此时我非常绝望。我以前没有使用过 for 循环,因为我避免使用它们并坚持使用其他解决方案。不确定我是否搞砸了语法,这似乎不太正确:
for(i in 1:nrow(dd)){
if(dd[i,4] %in% dd[i,2])
dd$test[i] <- 1
}
正如我所提到的,如果 FO.variable 在变量内部,我的理想输出是带有 1 或 0 的附加列。例如,样本数据中的前三条记录为 1,第四条记录为零,因为“直接/未知”不在“有机搜索,系统电子邮件”中。
如果解决方案可以快速运行,那将是一个好处。应用选项需要很长时间,可能是因为它们在两列的每次迭代中循环?
事实证明这并不像我想象的那么简单。或者也许是这样,而我只是个笨蛋。无论哪种方式,我都感谢有关如何最好地解决此问题的任何帮助。
【问题讨论】:
-
dd$cake = apply(dd, 1, function(x) grepl(x[4], x[2])) -
要快速识别某个向量是否在另一个向量中,可以使用
mergelike 操作。请参阅我的回答:stackoverflow.com/questions/29356496/…
标签: regex r dataframe data.table apply