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

Find lengthiest word in a column containing multiple words in R

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

我尝试了两种方式

  1. 在 airports$name 上使用 strsplit + 来自 stringr 的边界函数,但不知何故现在能够有效地完成这项工作。

  2. 使用单词功能,但它只取名字的第一个单词

     library(tidyverse)
     library(nycflights13)
     airport <- nycflights13::airports
    
     strsplit(word(airport$name),boundary("word"))
    

这是 purrr::map 的方法。首先,将 name 列拆分为 space。然后将自定义函数应用于创建的列表。我们可以使用 [ 将每个列表元素中的向量子集化为最长的单词。我们可以通过对每个元素应用 nchar 来确定最长的单词。 which.max 可以告诉我们哪一个最长。

map_char 版本将 return 一个字符向量。

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

@ian-campbell 的回答很棒,浏览时我想到了另一个更简单的选项来获得相同的结果(以防以后有人遇到这个问题)

library(tidyverse)
library(nycflights13)
airport <- nycflights13::airports

airports %>%
separate_rows(name, sep = ' ') %>% 
mutate(len=nchar(name)) %>% 
select(name,len) %>% 
arrange(desc(len))

我在学习 Ian 的回答时想到的另一个可能的答案(另外,我着火了,该死的!)

airport %>%
  mutate(longest = map(strsplit(name," "),~ nchar(.x))) %>% 
  unnest(longest) %>% 
  arrange(desc(longest))