【问题标题】:Cleaning string and number columns in an R data.table清理 R data.table 中的字符串和数字列
【发布时间】:2021-12-07 22:27:21
【问题描述】:

我尝试清理一个 data.frame,其中有包含文本和数字的列。我想排除示例列“名称”中的数字,只取“数字”列的第一个数字(不带字符串)。

我正在使用 data.table 并创建了这个框架:

df <- data.frame(x=c(1,2,3,4,5,6,7,8),
                 name=c('Tom', 'Maria. Anna3', 'Ina.2', 'Anna13', 'Tim2a', 'Zoé', 'Mark_1', 'Bea: 2'), 
                 number=c('12, 13', '11/12', '3b', '12, 13', '134z', 'number 14', 'B3', '3-5'))

如上所述,我希望有这样一张干净的桌子:

df_cleaned <- data.frame(x=c(1,2,3,4,5,6,7,8),
                         name=c('Tom', 'Maria Anna', 'Ina', 'Anna', 'Tim', 'Zoé', 'Mark', 'Bea'),
                         number=c('12', '11', '3', '12', '134', '14', '3', '3'))

非常感谢您的回复:)

【问题讨论】:

    标签: r string dataframe data.table


    【解决方案1】:

    您可以使用readr::parse_number,它正是这样做的。

    readr::parse_number(df$number)
    #[1]  12  11   3  12 134  14   3   3
    

    或者在基础 R 中 -

    as.numeric(sub('.*?(\\d+).*', '\\1', df$number))
    

    要清理名称,您可以使用正则表达式 -

    df$name <- sub('([ :_.]|\\d).*', '', df$name)
    #[1] "Tom"   "Maria" "Ina"   "Anna"  "Tim"   "Zoé"   "Mark"  "Bea"  
    

    【讨论】:

    • 很好,非常感谢列号工作正常。是否也有类似的方法来清理列名?
    • 更新了答案以包含它。
    • 我遇到过一些名称包含多个单词并且有时用点连接的情况。我刚刚更新了 "Maria. Anna3" --> "Maria Anna"。 @Ronak Shah 有没有简单的方法?
    【解决方案2】:

    这行得通吗:

    library(dplyr)
    library(stringr)
    df %>% mutate(name = str_extract(name, '[A-Za-z]+'), number = parse_number(number))
      x  name number
    1 1   Tom     12
    2 2 Maria     11
    3 3   Ina      3
    4 4  Anna     12
    5 5   Tim    134
    6 6    Zo     14
    7 7  Mark      3
    8 8   Bea      3
    

    【讨论】:

    • 感谢您的回答!如果我有特殊字符串(例如:ö、é、è 或 ä),我需要在 str_extract 函数中进行哪些更改?
    • @fjurt,对不起,我们需要在我们的正则表达式部分添加它str_extract(name, '[A-Za-z\\u00C0-\\u024F]+') 它将起作用。
    • 太好了,非常感谢@Karthik S
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2021-03-26
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多