【问题标题】:Omitting a digit in a string using grepl in R [duplicate]在R中使用grepl省略字符串中的数字[重复]
【发布时间】:2020-02-27 01:21:43
【问题描述】:

我正在使用 grepl 函数尝试对数据进行排序;所有的行号都是不同的调查对象,“ANI_type”字符串中的每个数字代表不同类型的动物——我需要根据动物类型对它们进行排序。例如,ANI_type 下的“2”代表猫。我以为我已经通过以下方式弄清楚了,但它不仅包括“2”,还包括任何包含“2”的数字。我怎样才能让它工作,以便它只包含“2”? 非常感谢,我对此非常陌生!

> animals$cats <- as.numeric(grepl("2", animals$ANI_type))
> animals
                                                    ANI_type dogs cats repamp
1                              1,2,5,12,13,14,15,16,18,19,27    1    1   TRUE
2                                                          2    0    1  FALSE
3                                             20,21,22,23,26    1    1   TRUE
4                                                20,21,22,23    1    1   TRUE
5                                                         13    1    0   TRUE
6                                                          2    0    1  FALSE
7                                                   20,21,22    1    1   TRUE
8                                                20,21,22,23    1    1   TRUE
9                                                   20,21,22    1    1   TRUE
10                                             5,20,21,22,27    1    1   TRUE
11                                              1,2,20,21,22    1    1   TRUE
12                                       5,18,20,21,22,23,26    1    1   TRUE
13                                                     20,21    1    1   TRUE
14                                                        21    1    1   TRUE
15                                                     20,21    1    1   TRUE
16                                                  20,21,26    1    1   TRUE
17                                                         2    0    1  FALSE
18                                                       1,2    1    1   TRUE
19                                                         2    0    1  FALSE
20                                                       3,4    0    0  FALSE

此外,我需要将字符串中的一些数字分组。例如,数字 6,7,8,9,10,11 都需要放在 animals$pock 对象中。我将如何使用 grep 函数来解决这个问题?只是使用很多边界标记?

【问题讨论】:

    标签: r string digits grepl


    【解决方案1】:

    您可以使用边界令牌(\\b):

    grepl("\\b2\\b", animals$ANI_type)
    

    但不依赖正则表达式,您可能希望构建数据结构,使每只动物都在自己的行中。您可以为此使用tidyr::separate_rows()

    library(tibble)
    library(tidyr)
    
    animals %>%
      rowid_to_column(var = "id") %>%
      separate_rows(ANI_type, sep = ",", convert = TRUE) 
    

    【讨论】:

    • 此外,我需要将字符串中的一些数字分组。例如,数字 6,7,8,9,10,11 都需要放在 animals$pock 对象中。我将如何使用 grep 函数来解决这个问题?只使用很多边界标记?
    • 我认为你最好分离字符串并匹配我上面的例子中的确切值。
    • 或者使用strsplit(),您可以执行animals$pock &lt;- sapply(strsplit(df$ANI_type, ","), function(x) any(c(6,7,8,9,10,11) %in% as.numeric(x))) 之类的操作。由于您的编辑改变了问题的重点,如果您需要进一步的帮助,最好发布一个新的。
    • 对于 tidyr - 行需要保持原样,因为它们都是来自不同受访者的答案,因此需要按列对动物类型进行排序。如果我使用 strsplit 函数,我需要对所有这些应用边界吗?我在使用 R 方面非常陌生——我的兴趣在于统计...我在计算机科学方面表现不佳:/。我将在 90 分钟窗口后再次发布。感谢您的帮助。
    • 不,上面的函数将字符串拆分并将值转换为数字,因此您可以与其他数字向量进行直接比较,这比依赖模式匹配字符向量更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2022-08-07
    • 1970-01-01
    • 2015-09-02
    • 2022-01-17
    • 1970-01-01
    • 2020-12-14
    相关资源
    最近更新 更多