Как легко объединить таблицу с уникальными элементами? - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть этот фрейм данных:

df <- data.frame(group=rep(1:3,each=3),
                 question=c("1.1.1. question 1","1.1.1.1. question1 with conditional","2.2.2.2. question2 with condtional", "2.2.2. question2","1.1.1.10. question 1 with conditional","3.3.3. question 3","3.3.3.2. question 3 with conditional","2.2.2.1. question 2 with conditional","3.3.3. Descirbe section 2.8"),
                 answer=c("yes","no","text","no","text","hello","yes","text","yes"),
                 parent_question=c("1.1.1. question 1","1.1.1. question 1","2.2.2. question2","2.2.2. question2","1.1.1. question 1","3.3.3. question 3","3.3.3. question 3","2.2.2. question2","3.3.3. Descirbe section 2.8"),
                 answer_parent=c("yes","yes","","","","","yes","","yes"))

Что я хочу сделать, это создать два новых столбца, называемых parent_question и parent_answer.
Итак, parent_question для 1.1.1. это 1.1.1. и родительский вопрос к 1.1.1.1. это 1.1.1. Я знаю, как это сделать, создав словарь parent_question и затем объединив его с этим набором данных. И parent_answer 1.1.1.1. является ответом на parent_question 1.1.1. Есть ли простой способ сделать это, не создавая отдельную таблицу для родительских вопросов и родительских ответов, а затем объединяя их с данными?

1 Ответ

0 голосов
/ 14 февраля 2020

Мы можем извлечь комбинацию чисел 1.1.1 или 1.1.1.1 из начала строки с помощью str_extract, создать логический «флаг», сгруппированный по главному вопросу «1.1.1», «2.2.2» , et c ('grp1'), создайте 'p_q', 'p_a', извлекая 'вопрос / ответ', где 'flag' равен TRUE. Если все они ЛОЖЬ, верните пустое ("")

library(dplyr)
library(stringr)
out <- df %>%
   mutate(grp1 = str_extract(question, "^([0-9]+\\.){2}[0-9]+"),
         grp2 = str_remove(str_extract(question, "^[0-9.]+"), "\\.$"), 
          flag = grp1 == grp2) %>%
   group_by(grp1) %>%
   mutate(parent_questionNew = question[which(flag)[1]]) %>%
   group_by(group, add = TRUE) %>%
   mutate(answer_parentNew = if(any(flag)) answer[which(flag & answer == "yes")[1]] 
         else replace(as.character(answer), answer != "yes", "")) %>%
   ungroup
out %>% 
 select(matches('parent'))
# A tibble: 9 x 4
#  parent_question             answer_parent parent_questionNew answer_parentNew
#  <fct>                       <fct>         <fct>              <chr>           
#1 1.1.1. question 1           "yes"         1.1.1. question 1  "yes"           
#2 1.1.1. question 1           "yes"         1.1.1. question 1  "yes"           
#3 2.2.2. question2            ""            2.2.2. question2   ""              
#4 2.2.2. question2            ""            2.2.2. question2    <NA>           
#5 1.1.1. question 1           ""            1.1.1. question 1  ""              
#6 3.3.3. question 3           ""            3.3.3. question 3   <NA>           
#7 3.3.3. question 3           "yes"         3.3.3. question 3  "yes"           
#8 2.2.2. question2            ""            2.2.2. question2   ""              
#9 3.3.3. Descirbe section 2.8 "yes"         3.3.3. question 3  "yes"     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...