为什么不';这两条R线是否产生相同的输出?

为什么不';这两条R线是否产生相同的输出?,r,stringr,R,Stringr,我最近开始玩弄R,我一辈子都不明白这两段代码为什么不能产生相同的输出: data.short[which(str_detect(data.short$name, "Miss")),] data.short[which(grep("Miss", data.short$name) > 1),] 从stru detect和grep这两个函数的定义中,我了解到,这两行基本相同;仅筛选出名称中包含“未命中”的条目 第一个代码就是这样做的。然而,第二个代码没有做任何事情。有人能解释一下吗?不,这

我最近开始玩弄
R
,我一辈子都不明白这两段代码为什么不能产生相同的输出:

 data.short[which(str_detect(data.short$name, "Miss")),]
 data.short[which(grep("Miss", data.short$name) > 1),]
stru detect
grep
这两个函数的定义中,我了解到,这两行基本相同;仅筛选出名称中包含“未命中”的条目


第一个代码就是这样做的。然而,第二个代码没有做任何事情。有人能解释一下吗?

不,这两种代码做的事情不一样

tl;博士

这两行代码是相似的

data.short[which(str_detect(data.short$name, "Miss")),]

data.short[grep("Miss", data.short$name),]

在这种情况下,如果您有兴趣了解原因

让我们举一个可复制的例子

x <- c("one", "onetwo", "two", "threeone", "three")
这是正确的,因为位置1、2和4处的矢量元素中有“一”

现在,让我们转到
grep

grep("one", x)
#[1] 1 2 4
这已经给出了您想要的预期输出

然而,当你在做

grep("one", x) > 1
你基本上在做什么

c(1, 2, 4) > 1

[1] FALSE  TRUE  TRUE
因为2和4大于1

现在你把
哪个
包裹在它上面,它给出了
值的索引,在这种情况下是2和3

which(grep("one", x) > 1)
#[1] 2 3

不,这两个代码做的不是同一件事

tl;博士

这两行代码是相似的

data.short[which(str_detect(data.short$name, "Miss")),]

data.short[grep("Miss", data.short$name),]

在这种情况下,如果您有兴趣了解原因

让我们举一个可复制的例子

x <- c("one", "onetwo", "two", "threeone", "three")
这是正确的,因为位置1、2和4处的矢量元素中有“一”

现在,让我们转到
grep

grep("one", x)
#[1] 1 2 4
这已经给出了您想要的预期输出

然而,当你在做

grep("one", x) > 1
你基本上在做什么

c(1, 2, 4) > 1

[1] FALSE  TRUE  TRUE
因为2和4大于1

现在你把
哪个
包裹在它上面,它给出了
值的索引,在这种情况下是2和3

which(grep("one", x) > 1)
#[1] 2 3
回报(如预期的那样):

第二,

data.short[which(grep("Miss", data.short$name) > 1),]
返回:

[1] Mister Mister Mister
Levels: Miss Mister
这是因为以下返回

grep("Miss", data.short$name)
[1] 4 5 6
如果你将其置于“大于1”的条件下,你会得到:

which(grep("Miss", data.short$name) > 1)
[1] 1 2 3
最后生成索引为1,2,3(上次调用的结果)的元素,而不是您可能想要的索引为4,5,6的元素:

data.short[which(grep("Miss", data.short$name) > 1),]
[1] Mister Mister Mister
Levels: Miss Mister
作为旁注:
grep
有一个参数
value
您可以设置为返回索引或索引值:

> grep("Miss", data.short$name)
[1] 4 5 6
> grep("Miss", data.short$name, value = TRUE)
[1] "Miss" "Miss" "Miss" 
编辑 分解
str\u detect发生的情况

str\u检测
对于模式位于字符串中的条目返回TRUE

str_detect(data.short$name, "Miss")
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
其中
返回索引

which(str_detect(data.short$name, "Miss"))
[1] 4 5 6
这反过来,作为一个索引,返回你所期望的

data.short[which(str_detect(data.short$name, "Miss")),]
[1] Miss Miss Miss
Levels: Miss Mister
我希望这有帮助

回报(如预期的那样):

第二,

data.short[which(grep("Miss", data.short$name) > 1),]
返回:

[1] Mister Mister Mister
Levels: Miss Mister
这是因为以下返回

grep("Miss", data.short$name)
[1] 4 5 6
如果你将其置于“大于1”的条件下,你会得到:

which(grep("Miss", data.short$name) > 1)
[1] 1 2 3
最后生成索引为1,2,3(上次调用的结果)的元素,而不是您可能想要的索引为4,5,6的元素:

data.short[which(grep("Miss", data.short$name) > 1),]
[1] Mister Mister Mister
Levels: Miss Mister
作为旁注:
grep
有一个参数
value
您可以设置为返回索引或索引值:

> grep("Miss", data.short$name)
[1] 4 5 6
> grep("Miss", data.short$name, value = TRUE)
[1] "Miss" "Miss" "Miss" 
编辑 分解
str\u detect发生的情况

str\u检测
对于模式位于字符串中的条目返回TRUE

str_detect(data.short$name, "Miss")
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
其中
返回索引

which(str_detect(data.short$name, "Miss"))
[1] 4 5 6
这反过来,作为一个索引,返回你所期望的

data.short[which(str_detect(data.short$name, "Miss")),]
[1] Miss Miss Miss
Levels: Miss Mister

我希望这有帮助。

我明白了。给我解释一下。“data.short[哪个(str_detect(data.short$name,“Miss”),]”是如何操作的?据我所知,它基本上是一个for循环,通过表中的每个观察值,将该条目的[name]列传递到str_detect函数中,并且仅当返回true时才返回它。这不是一个正确的执行模式吗?@Gummybears,我会在我的回答中加上几行。。。现在它有意义了。作为后续问题;假设我只想访问特定的行条目。data.short[(1,3,5),]似乎不起作用,尽管data.short[(1:3),]效果很好。@Gummybears
1:3
返回一个数字向量,与
c(1,2,3)
相同。如果你使用
c(1,3,5)
你的子集将再次工作。我明白了。给我解释一下。“data.short[哪个(str_detect(data.short$name,“Miss”),]”是如何操作的?据我所知,它基本上是一个for循环,通过表中的每个观察值,将该条目的[name]列传递到str_detect函数中,并且仅当返回true时才返回它。这不是一个正确的执行模式吗?@Gummybears,我会在我的回答中加上几行。。。现在它有意义了。作为后续问题;假设我只想访问特定的行条目。data.short[(1,3,5),]似乎不起作用,尽管data.short[(1:3),]效果很好。@Gummybears
1:3
返回一个数字向量,与
c(1,2,3)
相同。如果您使用
c(1,3,5)
您的子集将再次工作。