【发布时间】:2018-10-19 17:31:44
【问题描述】:
我的数据如下所示:
library(tidyverse)
library(stringr)
data <- tibble(cats = c("a", "a|b |c", " b", "b| c"))
我想将此列转换为列表,以便我可以取消嵌套,然后对其进行汇总,以便获取每个类别的值。
这是我想做的,但不起作用:
data %>%
str_split(cats, "\\|") %>%
unnest() %>%
str_trim(cats) %>%
count(cats)
我从阅读错误消息中了解到这是有问题的,因为 str_split 正在创建列表列表,而不是新的 data.frame/tibble。
所以,我这样做了,这就是我想要的结果:
data <- tibble(cats = str_split(data$cats, "\\|")) %>%
unnest()
data <- tibble(cats = str_trim(data$cats)) %>%
count(cats)
data
# A tibble: 3 x 2
cats n
<chr> <int>
1 a 2
2 b 3
3 c 2
此时,我已准备好继续前进,但我想了解一下我在管道中做错了什么。
【问题讨论】:
-
str_split的第一个参数应该是一个向量。例如,以data %>% pull(cats) %>% str_split(., "\\|") %>% ...开头。 -
@markus,使用此代码时
data %>% pull(cats) %>% str_split(., "\\|") %>% unnest() %>% str_trim(cats) %>% count(cats)我收到此错误:Error in UseMethod("unnest_") : no applicable method for 'unnest_' applied to an object of class "list" Calls: %>% ... freduce -> <Anonymous> -> unnest -> unnest.default -> unnest_ Execution halted -
试试
data %>% pull(cats) %>% str_split(., "\\|") %>% unlist() %>% str_trim(.) >% table() %>% as_data_frame() %>% setNames(., c("col1", "col2"))。但这与@benc 的回答相比是不必要的复杂。