为什么不';这两条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),]效果很好。@Gummybears1:3
返回一个数字向量,与c(1,2,3)
相同。如果您使用c(1,3,5)
您的子集将再次工作。