【问题标题】:Is there an R function to split the sentence是否有 R 函数来拆分句子
【发布时间】:2019-10-05 20:55:29
【问题描述】:

我有几个像下面这样的非结构化句子。下面的描述是列名

Description

Automatic lever for a machine
Vaccum chamber with additional spare
Glove box for R&D
The Mini Guage 5 sets
Vacuum chamber only
Automatic lever only

我想将这句话从 Col1 拆分为 Col5 并计算如下出现的次数

Col1             Col2            Col3               Col4               
Automatic_lever lever_for        for_a               a_machine  
Vaccum_chamber  chamber_with     with_additional    additional_spare     
Glove_box       box_for          for_R&D            R&D 
The_Mini        Mini_Guage       Guage_5             5_sets 
Vacuum_chamber  chamber_only     only       
Automatic_lever lever_only       only       

也从上面的列中,我可以有这些词的出现。就像,Vaccum_chamber 和 Automatic_lever 在这里重复了两次。同理,其他词的出现?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个tidyverse 选项

    df %>%
        rowid_to_column("row") %>%
        mutate(words = map(str_split(Description, " "), function(x) {
            if (length(x) %% 2 == 0) words <- c(words, "")
            idx <- 1:(length(words) - 1)
            map_chr(idx, function(i) paste0(x[i:(i + 1)], collapse = "_"))
        })) %>%
        unnest() %>%
        group_by(row) %>%
        mutate(
            words = str_replace(words, "_NA", ""),
            col = paste0("Col", 1:n())) %>%
        filter(words != "NA") %>%
        spread(col, words, fill = "")
    ## A tibble: 6 x 6
    ## Groups:   row [6]
    #    row Description                Col1        Col2       Col3       Col4
    #  <int> <fct>                      <chr>       <chr>      <chr>      <chr>
    #1     1 Automatic lever for a mac… Automatic_… lever_for  for_a      a_machine
    #2     2 Vaccum chamber with addit… Vaccum_cha… chamber_w… with_addi… additional…
    #3     3 Glove box for R&D          Glove_box   box_for    for_R&D    R&D
    #4     4 The Mini Guage 5 sets      The_Mini    Mini_Guage Guage_5    5_sets
    #5     5 Vacuum chamber only        Vacuum_cha… chamber_o… only       ""
    #6     6 Automatic lever only       Automatic_… lever_only only       ""
    

    解释:我们将Description 中的句子拆分为单个空格" ",然后使用滑动窗口方法将每两个单词连接在一起,确保每个sentence 始终有奇数个单词;剩下的只是一个长期到广泛的转变。

    不漂亮,但它重现了您的预期输出;而不是手动滑动窗口的方法,你也可以zoo::rollapply


    样本数据

    df <- read.table(text =
        "Description
    'Automatic lever for a machine'
    'Vaccum chamber with additional spare'
    'Glove box for R&D'
    'The Mini Guage 5 sets'
    'Vacuum chamber only'
    'Automatic lever only'", header = T)
    

    【讨论】:

    • 谢谢。但是incode col = paste0("Col1", 1:n())),列名就像COl1,COL11,COL12,............COL2......我的意思是说它是未排序,我们能否更改此代码,使列按 COL1、COL2、COL3 等排序
    • @Dev 尝试用sprintf("Col%02i", 1:n()) 替换paste0("Col", 1:n());这假设您最多有 99 列。如果您有 >99 列,请更改为 "Col%03i" 等等。
    • 附言。最后的忠告。如果我是你,我会以长格式(=整齐)而不是宽格式保存我的数据;整齐(长)的数据通常更容易在下游分析中处理。它当然更符合tidyverse 的数据处理范式。
    • @毛里求斯。非常感谢,你能解释一下这里的逻辑是什么。我没有得到?
    • @Dev sprintf 使用 C 库函数 sprintf 来格式化输出。在这种情况下,关键部分是 sprinf("%02i", x),这意味着将 x 格式化为整数 ("i"),带有两位数 ("2") 和前导零 ("0")。 % 是表示sprintf 标志开始的字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2019-10-08
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多