Grep包含我未指定的值

时间:2015-06-05 01:33:29

标签: r grep

我正在尝试根据某些列值获取行列表,但是当我grep这些值时,返回的行列表包含我没有指定值的行。

具体来说:我想要df$likert_classification != NAdf$variable为'picture_trained','unambig_picture_proportion'或'ambig_picture_proportion'的行。但grep指定的行包括'标准块'行,我没有要求它。

url <- 'http://pastebin.com/raw.php?i=DbMasR8Y'
df <- read.csv(url, as.is=T)
picture_transfer_trials_likert <- grep('picture_trained|unambig_picture_proportion|ambig_picture_proportion', df$variable[which(!is.na(df$likert_classification))])
unique(df$variable[picture_transfer_trials_likert])

criterion block不应包含在picture_transfer_trials_likert指定的行中,但它是。这里发生了什么?

2 个答案:

答案 0 :(得分:3)

您遇到的问题是grep()的这种特殊用法会返回适用于 grep()收到的确切向量的匹配索引。您没有将df$variable传递给grep,而是传递了该向量的子集,特别是df$variable[which(!is.na(df$likert_classification))]。如果您要使用生成的索引来索引df$variable,那么您将必须以完全相同的方式对其进行子集化以使索引适用。例如,这有效:

unique(df$variable[!is.na(df$likert_classification)][picture_transfer_trials_likert]);
## [1] "unambig_picture_proportion" "picture_trained"            "ambig_picture_proportion"

另请注意,我省略了which()调用,这是不必要的,因为您可以直接使用逻辑向量索引,而不是使用数字向量索引,这就是您使用{{1调用。

但值得一提的是,which()还有另一个非常有用的模式:您可以通过grep()来获取实际匹配,而不是匹配索引,因此您的需求可以在一行中完成:

value=T

另请注意,我在正则表达式中包含了锚点,因为它看起来像是在尝试进行完全完整的字符串匹配。但如果确实如此,那么你甚至不应该使用正则表达式,你应该进行字符串相等测试。

实际上,除此之外,在查看您的逻辑时,我认为您的代码的最终结果是您正在使用三个固定字符串并且只返回{{{{{{{ 1}}在unique(grep('^picture_trained$|^unambig_picture_proportion$|^ambig_picture_proportion$', df$variable[!is.na(df$likert_classification)], value=T )); ## [1] "unambig_picture_proportion" "picture_trained" "ambig_picture_proportion" 不是NA的行中。这实际上可以使用df$variable来完成,将固定字符串的向量作为第一个参数传递,将df$likert_classification中的唯一值向量排除在intersect()中NA值以下的行中。第二个论点:

df$variable

答案 1 :(得分:0)

由于某种原因,它与你如何过滤NA观察结果有关。我发现这种解决方法有效...我只是将grep更改为“图片”,因为输入速度更快:

picture_transfer_trials_likert <- grep('picture', df$variable[df$likert_classification!='NA'])
unique(df$variable[picture_transfer_trials_likert])

#[1] "unambig_picture_proportion" "picture_trained"            "ambig_picture_proportion"

这使用您原来的grep

picture_transfer_trials_likert <- grep('picture_trained|unambig_picture_proportion|ambig_picture_proportion', df$variable[df$likert_classification!='NA'])
unique(df$variable[picture_transfer_trials_likert])

#[1] "unambig_picture_proportion" "picture_trained"            "ambig_picture_proportion"