【问题标题】:R: Splitting up strings "pairwise" into a variable number of elementsR:将字符串“成对”拆分为可变数量的元素
【发布时间】:2020-10-10 13:57:40
【问题描述】:

我的目标是绘制问卷的结构。 对于每个受访者,我都有一个价值,给出回答的问题加上回答时间: q1:2,q2:3,q4:4,q10:4 表示对应的受访者先回答问题q1(2 秒内),然后回答q2(3 秒内),以此类推,直到问题q10。有时问题的名称也以“d”开头(例如d10),这只是另一种类型的问题。

例子:

dat <- data.frame(path = c(
  "q1:9,q2:8,d3:10,q10:3,q4:10",
  "q1:10,q2:10,q10:2,q4:2",
  "q1:2,q2:3,d11:2"
))

我的想法是将调查问卷的回答结构绘制为网络图。所以我需要一份长长的清单,列出受访者在问卷中所做的所有不同“步骤”:

from | to
------------
q1     q2 # first respondent
q2     d3
d3     q10
q10    q4
q1     q2 # second respondent
q2     q10
q10    q4
q1     q2 # third respondent
q2     d11
...

我的问题是,由于过滤问题,并非所有受访者都必须回答相同数量的问题(所以我不能使用 separate(, into=?),因为 ? 是可变的)。此外,变量需要“成对”拆分。

有人知道如何获取上述数据框吗?

当然,最终目标是有一个表格,其中包含每个“步骤”的受访者数量(例如,20 个受访者从 q1q2,因此 20 可以用作加权变量图表)。

谢谢!

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    你的意思是像下面这样的吗?

    do.call(
      rbind,
      lapply(
        strsplit(dat$path, ":\\d+,?"),
        function(v) data.frame(from = v[-length(v)], to = v[-1])
      )
    )
    

    给了

      from  to
    1   q1  q2
    2   q2  d3
    3   d3 q10
    4  q10  q4
    5   q1  q2
    6   q2 q10
    7  q10  q4
    8   q1  q2
    9   q2 d11
    

    【讨论】:

      【解决方案2】:

      str_extract 的选项

      library(dplyr)
      library(tidyr)
      library(stringr)
      library(purrr)
      dat %>% 
          transmute(from = str_extract_all(path, "\\w+(?=:)"), to = map(from, lead)) %>%
          unnest(c(from, to)) %>%
          filter(!is.na(to))
      

      -输出

      # A tibble: 9 x 2
      #  from  to   
      #  <chr> <chr>
      #1 q1    q2   
      #2 q2    d3   
      #3 d3    q10  
      #4 q10   q4   
      #5 q1    q2   
      #6 q2    q10  
      #7 q10   q4   
      #8 q1    q2   
      #9 q2    d11  
      

      【讨论】:

        【解决方案3】:

        这样回答吗:

        > dat %>% mutate(ID = row_number()) %>%  
        +           separate_rows(path,sep = ',') %>% 
        +                   extract(col = path, into = c('ques','number'), regex = '(.*):(.*)') %>% 
        +                                   select(-number) %>% group_by(ID) %>% mutate(from = ques, to = lead(ques)) %>% ungroup() %>% select(c(-ques,-ID)) %>% na.omit()
        # A tibble: 9 x 2
          from  to   
          <chr> <chr>
        1 q1    q2   
        2 q2    d3   
        3 d3    q10  
        4 q10   q4   
        5 q1    q2   
        6 q2    q10  
        7 q10   q4   
        8 q1    q2   
        9 q2    d11  
        > 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-30
          • 2014-09-27
          • 2011-05-31
          • 2015-01-23
          • 2019-02-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多