在带有向量元素的 tibbles 上使用 dplyr 的问题 [列表列]
Problem using dplyr on tibbles with vector elements [list columns]
我 运行 在使用 dplyr 和 stringr 函数(特别是 str_split())进行文本处理时遇到了一些问题。我想我在处理 vectors/lists.
元素时误解了一些关于如何正确使用 dplyr 的非常基本的东西
这是一个小问题,df...
library(tidyverse)
df <- tribble(
~item, ~phrase,
"one", "romeo and juliet",
"two", "laurel and hardy",
"three", "apples and oranges and pears and peaches"
)
现在我创建了一个新列,splitPhrase,方法是在其中一个列上执行 str_split() 使用“ 和”作为分隔符。
df <- df %>%
mutate(splitPhrase = str_split(phrase,"and"))
这在 RStudio 中似乎有效,我看到了这个...
在控制台中,我看到我的新列 splitPhrase 实际上由列表组成...但它在 Rstudio 显示中看起来是正确的,对吗?
df
#> # A tibble: 3 x 3
#> item phrase splitPhrase
#> <chr> <chr> <list>
#> 1 one romeo and juliet <chr [2]>
#> 2 two laurel and hardy <chr [2]>
#> 3 three apples and oranges and pears and peaches <chr [4]>
我最终想做的 是提取每个 splitPhrase 的 last 项。换句话说,我想讲这个...
问题是我看不到如何只获取每个 splitPhrase 中的最后一个元素。如果它只是一个矢量,我可以做这样的事情...
#> last( c("a","b","c") )
#[1] "c"
#>
但这在 tibble 中不起作用,想到的其他事情也不起作用:
df <- df %>%
mutate(lastThing = last(splitPhrase))
# Error in mutate_impl(.data, dots) :
# Column `lastThing` must be length 3 (the number of rows) or one, not 4
df <- df %>% group_by(splitPhrase) %>%
mutate(lastThing = last(splitPhrase))
# Error in grouped_df_impl(data, unname(vars), drop) :
# Column `splitPhrase` can't be used as a grouping variable because it's a list
所以,我想我 "not getting" 如何处理 table/tibble 列中元素内的向量。这似乎与在我的示例中它实际上是一个向量列表这一事实有关。
是否有特定功能可以帮助我解决这个问题,或者有更好的方法吗?
由 reprex package (v0.2.1)
创建于 2018-09-27
'splitPhrase'列是一个list
,所以我们遍历list
得到元素
library(tidyverse)
df %>%
mutate(splitPhrase = str_split(phrase,"\s*and\s*"),
Last = map_chr(splitPhrase, last)) %>%
select(item, Last)
但是,它可以通过多种方式完成。使用 separate_rows
,展开列,然后得到按 'item'
分组的 last
元素
df %>%
separate_rows(phrase,sep = " and ") %>%
group_by(item) %>%
summarise(Last = last(phrase))
没测试过效率,不过我们也可以用regex提取最后一个"and":
之后的字符串段
与sub
:
library(dplyr)
df %>%
mutate(lastThing = sub("^.*and\s", "", phrase)) %>%
select(-phrase)
与str_extract
:
library(stringr)
df %>%
mutate(lastThing = str_extract(phrase, "(?<=and\s)\w+$")) %>%
select(-phrase)
与extract
:
library(tidyr)
df %>%
extract(phrase, "lastThing", "^.*and\s(\w+)")
输出:
# A tibble: 3 x 2
item lastThing
<chr> <chr>
1 one juliet
2 two hardy
3 three peaches
我 运行 在使用 dplyr 和 stringr 函数(特别是 str_split())进行文本处理时遇到了一些问题。我想我在处理 vectors/lists.
元素时误解了一些关于如何正确使用 dplyr 的非常基本的东西这是一个小问题,df...
library(tidyverse)
df <- tribble(
~item, ~phrase,
"one", "romeo and juliet",
"two", "laurel and hardy",
"three", "apples and oranges and pears and peaches"
)
现在我创建了一个新列,splitPhrase,方法是在其中一个列上执行 str_split() 使用“ 和”作为分隔符。
df <- df %>%
mutate(splitPhrase = str_split(phrase,"and"))
这在 RStudio 中似乎有效,我看到了这个...
在控制台中,我看到我的新列 splitPhrase 实际上由列表组成...但它在 Rstudio 显示中看起来是正确的,对吗?
df
#> # A tibble: 3 x 3
#> item phrase splitPhrase
#> <chr> <chr> <list>
#> 1 one romeo and juliet <chr [2]>
#> 2 two laurel and hardy <chr [2]>
#> 3 three apples and oranges and pears and peaches <chr [4]>
我最终想做的 是提取每个 splitPhrase 的 last 项。换句话说,我想讲这个...
问题是我看不到如何只获取每个 splitPhrase 中的最后一个元素。如果它只是一个矢量,我可以做这样的事情...
#> last( c("a","b","c") )
#[1] "c"
#>
但这在 tibble 中不起作用,想到的其他事情也不起作用:
df <- df %>%
mutate(lastThing = last(splitPhrase))
# Error in mutate_impl(.data, dots) :
# Column `lastThing` must be length 3 (the number of rows) or one, not 4
df <- df %>% group_by(splitPhrase) %>%
mutate(lastThing = last(splitPhrase))
# Error in grouped_df_impl(data, unname(vars), drop) :
# Column `splitPhrase` can't be used as a grouping variable because it's a list
所以,我想我 "not getting" 如何处理 table/tibble 列中元素内的向量。这似乎与在我的示例中它实际上是一个向量列表这一事实有关。
是否有特定功能可以帮助我解决这个问题,或者有更好的方法吗?
由 reprex package (v0.2.1)
创建于 2018-09-27'splitPhrase'列是一个list
,所以我们遍历list
得到元素
library(tidyverse)
df %>%
mutate(splitPhrase = str_split(phrase,"\s*and\s*"),
Last = map_chr(splitPhrase, last)) %>%
select(item, Last)
但是,它可以通过多种方式完成。使用 separate_rows
,展开列,然后得到按 'item'
last
元素
df %>%
separate_rows(phrase,sep = " and ") %>%
group_by(item) %>%
summarise(Last = last(phrase))
没测试过效率,不过我们也可以用regex提取最后一个"and":
之后的字符串段与sub
:
library(dplyr)
df %>%
mutate(lastThing = sub("^.*and\s", "", phrase)) %>%
select(-phrase)
与str_extract
:
library(stringr)
df %>%
mutate(lastThing = str_extract(phrase, "(?<=and\s)\w+$")) %>%
select(-phrase)
与extract
:
library(tidyr)
df %>%
extract(phrase, "lastThing", "^.*and\s(\w+)")
输出:
# A tibble: 3 x 2
item lastThing
<chr> <chr>
1 one juliet
2 two hardy
3 three peaches