在包含 R 中多个单词的列中查找最长的单词
Find lengthiest word in a column containing multiple words in R
我正在使用 nycflights13 包中的机场数据集。我想从第二列中找到长度最长的单词,即 name
我尝试了两种方式
在 airports$name 上使用 strsplit + 来自 stringr 的边界函数,但不知何故现在能够有效地完成这项工作。
使用单词功能,但它只取名字的第一个单词
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))
我正在使用 nycflights13 包中的机场数据集。我想从第二列中找到长度最长的单词,即 name
我尝试了两种方式
在 airports$name 上使用 strsplit + 来自 stringr 的边界函数,但不知何故现在能够有效地完成这项工作。
使用单词功能,但它只取名字的第一个单词
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))