【问题标题】:Find lengthiest word in a column containing multiple words in R在R中包含多个单词的列中查找最长的单词
【发布时间】:2021-05-11 16:04:57
【问题描述】:

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

我尝试了两种方法

  1. 在 airports$name 上使用 stringr 中的 strsplit + 边界函数,但现在能够以某种方式有效地完成此操作。

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

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

【问题讨论】:

  • airport$name[which.max(nchar(airport$name))]
  • 我对这个问题的理解是作者要找到“长度最长的单词”,而不是最长的机场名称。他们对strsplit的使用进一步表明了这种意图。

标签: r dplyr tidyverse stringr


【解决方案1】:

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

_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

【讨论】:

  • 为什么使用mapnchar 是矢量化的??
  • 谢谢,这真的很有帮助。我需要多一步才能找到“最长”列中最长单词的长度。我想我可以做 len(max) 但只是想知道 %>% 中是否有一种复杂的方法
  • @VaibhavSingh 看看我的编辑是否能解决您的问题。
  • 完成了,太棒了。我仍在分解地图和自定义功能,但看起来绝对正确
【解决方案2】:

@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))

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    相关资源
    最近更新 更多