在R中包含多个单词的列中查找最长的单词

在R中包含多个单词的列中查找最长的单词,r,dplyr,tidyverse,stringr,R,Dplyr,Tidyverse,Stringr,我正在使用nycflights13软件包中的机场数据集。我想从第二列即名称中找到长度最长的单词 我试了两种方法 在airports$name上使用stringr的strsplit+boundary frunction,但现在能够有效地完成这项工作 使用word函数,但它仅从名称中提取第一个单词 library(tidyverse) library(nycflights13) airport <- nycflights13::airports strsplit(word(airp

我正在使用nycflights13软件包中的机场数据集。我想从第二列即名称中找到长度最长的单词

我试了两种方法

  • 在airports$name上使用stringr的strsplit+boundary frunction,但现在能够有效地完成这项工作

  • 使用word函数,但它仅从名称中提取第一个单词

     library(tidyverse)
     library(nycflights13)
     airport <- nycflights13::airports
    
     strsplit(word(airport$name),boundary("word"))
    
    库(tidyverse)
    图书馆(nycflights13)
    
    机场这里有一个带有
    purrr::map
    的方法。首先,按空格拆分
    名称
    列。然后对创建的列表应用自定义函数。我们可以使用
    [
    将每个列表元素中的向量子集为最长的单词。我们可以通过对每个元素应用
    nchar
    来确定最长的单词。
    which.max
    可以告诉我们哪个最长

    \u char
    版本的
    map
    将返回一个字符向量

    library(tidyverse)
    airport %>%
       mutate(longest = map_chr(strsplit(name," "),
                                ~ .x[which.max(nchar(.x))]),
              wordlength = nchar(longest)) %>%
       select(name,longest,wordlength)
    ## A tibble: 1,458 x 3
    #   name                           longest      wordlength
    #   <chr>                          <chr>             <int>
    # 1 Lansdowne Airport              Lansdowne             9
    # 2 Moton Field Municipal Airport  Municipal             9
    # 3 Schaumburg Regional            Schaumburg           10
    # 4 Randall Airport                Randall               7
    # 5 Jekyll Island Airport          Airport               7
    # 6 Elizabethton Municipal Airport Elizabethton         12
    # 7 Williams County Airport        Williams              8
    # 8 Finger Lakes Regional Airport  Regional              8
    # 9 Shoestring Aviation Airfield   Shoestring           10
    #10 Jefferson County Intl          Jefferson             9
    ## … with 1,448 more rows
    
    库(tidyverse)
    机场%>%
    变异(最长=map_chr(strsplit(name)”,
    ~.x[which.max(nchar(.x))],
    wordlength=nchar(最长))%>%
    选择(名称、最长、字长)
    ##A tibble:1458x3
    #名称最长字长
    #                                          
    #1兰斯敦机场兰斯敦9
    #2摩顿机场市政机场市政9
    #3绍姆堡地区绍姆堡10
    #4兰德尔机场兰德尔7
    #5杰基尔岛机场7
    #6伊丽莎白市机场伊丽莎白市12
    #7威廉姆斯县机场威廉姆斯8
    #指湖地区机场地区8
    #9小本经营航空机场小本经营10
    #10杰斐逊县国际杰斐逊9
    ##…还有1448行
    
    @ian campbell精彩的答案非常棒,在浏览网页时,我想出了另一个更简单的选项,以获得相同的结果(万一以后有人遇到这个问题)


    airport$name[which.max(nchar(airport$name))]
    我对这个问题的理解是作者想找到“长度最长的单词”,而不是最长的机场名称。这一意图通过他们使用的
    strsplit
    得到了进一步证明。为什么使用
    map
    nchar
    是矢量化的呢?啊,是的,很好。谢谢,这真的很有帮助。不过我还需要一步,才能在“最长”列中找到最长单词的长度。我想我能做到len(max)但我只是想知道%>%@VaibhavSingh中是否有一种复杂的方式,看看我的编辑是否能澄清你的问题。完成了,太棒了。我仍在分解映射和自定义函数,但看起来绝对正确
    library(tidyverse)
    library(nycflights13)
    airport <- nycflights13::airports
    
    airports %>%
    separate_rows(name, sep = ' ') %>% 
    mutate(len=nchar(name)) %>% 
    select(name,len) %>% 
    arrange(desc(len))
    
    airport %>%
      mutate(longest = map(strsplit(name," "),~ nchar(.x))) %>% 
      unnest(longest) %>% 
      arrange(desc(longest))