除了grep还有其他选择吗?
Is there another alternative to grep?
我有两个data frames
。其中一个包含问题的数量 作为文本 ,我使用 grep()
函数将这些数字与我的其他 dataframe
列的名称相匹配。
问题是我的 code
的一部分不起作用,因为我的 function
grep()
没有发挥作用。
基本上我的两个dataframes
如下
DF1:
Question
Group
11
Redmeat
100
Chicken
56
Vegetables
210
Dairy
DF 2(值无关紧要,重要的是列名):
1.Question
2.Question
...
101.Question
...
250.Question
Yes
No
...
...
...
...
Yes
Yes
...
...
...
...
No
Yes
...
...
...
...
No
Yes
...
...
...
...
我使用以下代码:
i <- n ## I change n according to the row of DF1 that I want
grep(DF1$Question[i], colnames(DF2), fixed = T)
如果我这样做:
i <- 2 ## (Question number 100)
grep(DF1$Question[i], colnames(DF2), fixed = T)
我的代码 returns 100,这是正确的,因为它是对应于“100.Question”
的列
但如果我这样做:
i <- 1 ## (Question number 1)
grep(DF1$Question[i], colnames(DF2), fixed = T)
我的代码 returns 1, 11, 21 ... 101 ... 201
如果我这样做也一样:
i <- 3 ## (Question number 56)
grep(DF1$Question[i], colnames(DF2), fixed = T)
它 returns 56, 156
我只想要完全相同的号码。即使我使用参数 fixed = TRUE
它也不起作用。
是否有解决方案或替代方案?
您需要 grep
以获得唯一值,因此您应该 grep
字符串的开头 ^
,以及您的号码和点 .
。在这种情况下,您不能使用 fixed = T
参数,因为您使用的是正则表达式来匹配。
grep(paste0("^", DF1$Question[i], "\."), colnames(DF2))
两个选项:1) 在 grep 模式中包含 .
,grep(paste0("^", DF1$Question[i], "\."), colnames(DF2))
,或 2) 粘贴完整的 ".Question"
并使用完全匹配,完全不使用任何 grep: paste0(DF1$Question, ".Question")
。这可能比正则表达式更有效。由于您的代码到处都是这些 i
,我假设您使用的是循环。 grep 和 paste 是矢量化的,因此如果您提供更多上下文,我们也许能够帮助您完全避免循环。
如何在 pattern
中指定您想要从头开始 ^
并且希望其后跟 .Q
?
i=3
grep(paste0("^",DF1$Question[i],".Q"), colnames(DF2))
输出:
[1] 56
我有两个data frames
。其中一个包含问题的数量 作为文本 ,我使用 grep()
函数将这些数字与我的其他 dataframe
列的名称相匹配。
问题是我的 code
的一部分不起作用,因为我的 function
grep()
没有发挥作用。
基本上我的两个dataframes
如下
DF1:
Question | Group |
---|---|
11 | Redmeat |
100 | Chicken |
56 | Vegetables |
210 | Dairy |
DF 2(值无关紧要,重要的是列名):
1.Question | 2.Question | ... | 101.Question | ... | 250.Question |
---|---|---|---|---|---|
Yes | No | ... | ... | ... | ... |
Yes | Yes | ... | ... | ... | ... |
No | Yes | ... | ... | ... | ... |
No | Yes | ... | ... | ... | ... |
我使用以下代码:
i <- n ## I change n according to the row of DF1 that I want
grep(DF1$Question[i], colnames(DF2), fixed = T)
如果我这样做:
i <- 2 ## (Question number 100)
grep(DF1$Question[i], colnames(DF2), fixed = T)
我的代码 returns 100,这是正确的,因为它是对应于“100.Question”
的列但如果我这样做:
i <- 1 ## (Question number 1)
grep(DF1$Question[i], colnames(DF2), fixed = T)
我的代码 returns 1, 11, 21 ... 101 ... 201
如果我这样做也一样:
i <- 3 ## (Question number 56)
grep(DF1$Question[i], colnames(DF2), fixed = T)
它 returns 56, 156
我只想要完全相同的号码。即使我使用参数 fixed = TRUE
它也不起作用。
是否有解决方案或替代方案?
您需要 grep
以获得唯一值,因此您应该 grep
字符串的开头 ^
,以及您的号码和点 .
。在这种情况下,您不能使用 fixed = T
参数,因为您使用的是正则表达式来匹配。
grep(paste0("^", DF1$Question[i], "\."), colnames(DF2))
两个选项:1) 在 grep 模式中包含 .
,grep(paste0("^", DF1$Question[i], "\."), colnames(DF2))
,或 2) 粘贴完整的 ".Question"
并使用完全匹配,完全不使用任何 grep: paste0(DF1$Question, ".Question")
。这可能比正则表达式更有效。由于您的代码到处都是这些 i
,我假设您使用的是循环。 grep 和 paste 是矢量化的,因此如果您提供更多上下文,我们也许能够帮助您完全避免循环。
如何在 pattern
中指定您想要从头开始 ^
并且希望其后跟 .Q
?
i=3
grep(paste0("^",DF1$Question[i],".Q"), colnames(DF2))
输出:
[1] 56