【问题标题】:Split a character string and convert to data.frame/tibble in R?拆分字符串并转换为R中的data.frame/tibble?
【发布时间】: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 %&gt;% pull(cats) %&gt;% str_split(., "\\|") %&gt;% ... 开头。
  • @markus,使用此代码时data %&gt;% pull(cats) %&gt;% str_split(., "\\|") %&gt;% unnest() %&gt;% str_trim(cats) %&gt;% count(cats) 我收到此错误:Error in UseMethod("unnest_") : no applicable method for 'unnest_' applied to an object of class "list" Calls: %&gt;% ... freduce -&gt; &lt;Anonymous&gt; -&gt; unnest -&gt; unnest.default -&gt; unnest_ Execution halted
  • 试试data %&gt;% pull(cats) %&gt;% str_split(., "\\|") %&gt;% unlist() %&gt;% str_trim(.) &gt;% table() %&gt;% as_data_frame() %&gt;% setNames(., c("col1", "col2"))。但这与@benc 的回答相比是不必要的复杂。

标签: r list stringr


【解决方案1】:

您应该能够将您的 str_splitstr_trim 函数放在 mutate 参数中,如下所示:

data <- data %>% 
  mutate(cats = str_split(cats, "\\|")) %>% 
  unnest() %>% 
  mutate(cats = str_trim(cats))

data <- data %>% group_by(cats) %>% summarize(n = n())

data

# A tibble: 3 x 2
  cats      n
  <chr> <int>
1 a         2
2 b         3
3 c         2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多