【问题标题】:Convert list to string with conditions将列表转换为带条件的字符串
【发布时间】:2022-01-24 02:48:22
【问题描述】:

我有一个如下所示的数据框:

x <- tibble(
  experiment_id = rep(c('1a','1b'),each=5),
  keystroke = rep(c('a','SHIFT','b','SPACE','e'),2)
)

我知道我可以使用str_cstr_flatten 将列表连接成一个字符串,并且只保留如下某些值:

> y <- c('b','a','SPACE','d')
> y[y %in% letters]
[1] "b" "a" "d"

但是当我在分组管道中尝试同样的事情时:

x_out <- x %>%
  group_by(experiment_id) %>%
  mutate(
    grp = cumsum(lag(keystroke=='SPACE',default=0))) %>% 
    group_by(grp, .add=TRUE) %>%
      mutate(within_keystrokes = list(keystroke),
             within_word = within_keystrokes[within_keystrokes %in% letters]
             ) %>% 
  ungroup()

我得到错误:

Error: Problem with `mutate()` input `within_word`.
x Input `within_word` can't be recycled to size 2.
ℹ Input `within_word` is `within_keystrokes[within_keystrokes %in% letters]`.
ℹ Input `within_word` must be size 2 or 1, not 0.
ℹ The error occurred in group 1: experiment_id = "1a", grp = 0.

我阅读了this answer 并尝试使用ifelse,但仍然遇到错误。

对我做错了什么有任何见解吗?

编辑:预期输出很抱歉没有包括这个。我希望最终的 df 看起来像:

    x <- tibble(
      experiment_id = rep(c('1a','1b'),each=5),
      keystroke = rep(c('a','SHIFT','b','SPACE','e'),2),
      within_keystrokes = list(list('a','SHIFT','b','SPACE'), 
                          list('a','SHIFT','b','SPACE'), 
                          list('a','SHIFT','b','SPACE'), 
                          list('a','SHIFT','b','SPACE'),
                          'e',
                          list('a','SHIFT','b','SPACE'), 
                          list('a','SHIFT','b','SPACE'), 
                          list('a','SHIFT','b','SPACE'), 
                          list('a','SHIFT','b','SPACE'),
                          'e'),
      within_word = rep(list('ab','ab','ab','ab','e'),2)
)

【问题讨论】:

  • 你的预期输出是什么?
  • 对不起,我应该澄清一下。我需要将每个单词映射回原始 df,所以我知道哪个击键是哪个单词的一部分。

标签: r nlp tidyverse


【解决方案1】:

您几乎解决了您的问题。你可以使用

library(dplyr)
library(stringr)

x %>%
  group_by(experiment_id, grp = cumsum(lag(keystroke == "SPACE", default = 0))) %>% 
  mutate(
    within_keystrokes = list(keystroke),
    within_word = list(str_c(keystroke[keystroke %in% letters], collapse = ""))
    )

得到

# A tibble: 10 x 4
   experiment_id keystroke within_keystrokes within_word
   <chr>         <chr>     <list>            <list>     
 1 1a            a         <list [4]>        <chr [1]>  
 2 1a            SHIFT     <list [4]>        <chr [1]>  
 3 1a            b         <list [4]>        <chr [1]>  
 4 1a            SPACE     <list [4]>        <chr [1]>  
 5 1a            e         <chr [1]>         <chr [1]>  
 6 1b            a         <list [4]>        <chr [1]>  
 7 1b            SHIFT     <list [4]>        <chr [1]>  
 8 1b            b         <list [4]>        <chr [1]>  
 9 1b            SPACE     <list [4]>        <chr [1]>  
10 1b            e         <chr [1]>         <chr [1]> 

如果您不希望 within_word 成为列表,只需删除 list() 函数即可。

【讨论】:

  • 只有一个问题:最后我想把它附加到原始 df 的每一行,而不是总结。你能修改你的答案吗?
  • 能否根据您在问题中的输入显示您的预期输出,好吗? (现在需要睡觉,稍后再检查)
  • 很抱歉。我已经添加了预期的输出。
  • 非常感谢! (抱歉回复晚了,我不应该在假期旅行时检查 SO...)
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 2020-07-30
  • 2020-06-05
  • 2022-11-17
  • 2022-11-23
  • 2014-07-07
  • 2014-02-02
  • 2019-04-11
相关资源
最近更新 更多