Условный tidyr:: complete() до максимума переменной

#r #dplyr #tidyr

#r #dplyr #tidyr

Вопрос:

Я хотел бы использовать complete() (или другой метод) для заполнения столбца, но до определенного уровня значений для каждого.

Используя следующие данные:

 library(tidyverse)

df <- tribble(~Question_Code,   ~RespondentLevel,
"Engagement - Inclusion",   5,
"External engagement - policies",   2,
"External engagement - technology", 5,
"Community data",   5,
"Internal engagement",  5,
"Internal use of technology",   4,
"Familiarity/Alignment",    5,
"Environmental impacts",    5,
"Innovation",   2,
"Use of open-source technology",    2,
"Regulation of hardware amp; software",    5,
"In-house technical capacity",  5,
"Infrastructure procurement",   5,
"Algorithmic Error amp; Bias", 2,
"Control: Privacy", 5,
"Accountability in Governance Structures",  3,
"Open procurement", 5,
"Use in decision-making",   1,
"Accountability",   1,
"External Control", 4,
"Internal Control", 2,
"Open Data",    2)

#A tibble: 22 x 2
   Question_Code                    RespondentLevel
   <chr>                                      <dbl>
 1 Engagement - Inclusion                         5
 2 External engagement - policies                 2
 3 External engagement - technology               5
 4 Community data                                 5
 5 Internal engagement                            5
 6 Internal use of technology                     4
 7 Familiarity/Alignment                          5
 8 Environmental impacts                          5
 9 Innovation                                     2
10 Use of open-source technology                  2
# ... with 12 more rows

  

Например, «Взаимодействие — включение» имеет уровень 5, поэтому я хотел бы, чтобы это «завершилось» как 1,2,3,4,5. Однако «Политики внешнего взаимодействия» имеют уровень 2, поэтому я хотел бы, чтобы это было завершено только с помощью 1,2.

Используя

 df_full <- df %>%
  complete(nesting(Question_Code), RespondentLevel) %>%
  mutate(RespondentLevel = as.character(RespondentLevel)) 
# A tibble: 110 x 3
   Question_Code    RespondentLevel  
   <fct>            <chr>             
 1 Open Data        1                   
 2 Open Data        2              
 3 Open Data        3                 
 4 Open Data        4                   
 5 Open Data        5                  
 6 Internal Control 1                
 7 Internal Control 2               
 8 Internal Control 3                    
 9 Internal Control 4                    
10 Internal Control 5                    
# ... with 100 more rows

  

Выполнено каждое, начиная с 1: 5, но как ограничить это для каждого максимума по значению?

Любезно благодарю вас, я работаю над предоставлением решения ifelse ().

Комментарии:

1. Спасибо всем — все корректны и полезны, я отметил все подходы, но для простоты выбрал решение от @tmfmnk.

Ответ №1:

Одной tidyverse возможностью может быть:

 df %>%
 group_by(Question_Code) %>%
 complete(RespondentLevel = full_seq(1:max(RespondentLevel), 1))

   Question_Code                           RespondentLevel
   <chr>                                             <dbl>
 1 Accountability                                        1
 2 Accountability in Governance Structures               1
 3 Accountability in Governance Structures               2
 4 Accountability in Governance Structures               3
 5 Algorithmic Error amp; Bias                              1
 6 Algorithmic Error amp; Bias                              2
 7 Community data                                        1
 8 Community data                                        2
 9 Community data                                        3
10 Community data                                        4
  

Ответ №2:

Вот подход data.table для некоторого разнообразия:

 library(data.table)
setDT(df)
df[, .(RespondentLevel = seq_len(RespondentLevel)), by = .(Question_Code)]
#                              Question_Code RespondentLevel
# 1:                  Engagement - Inclusion               1
# 2:                  Engagement - Inclusion               2
# 3:                  Engagement - Inclusion               3
# 4:                  Engagement - Inclusion               4
# 5:                  Engagement - Inclusion               5
# 6:          External engagement - policies               1
# 7:          External engagement - policies               2
# 8:        External engagement - technology               1
# 9:        External engagement - technology               2
# 10:        External engagement - technology               3
# 11:        External engagement - technology               4
# 12:        External engagement - technology               5
  

Ответ №3:

Вы также могли бы использовать expand

 library(tidyverse)

df %>%
  group_by(Question_Code) %>%
  expand(RespondentLevel = 1:max(RespondentLevel))

# Question_Code                           RespondentLevel
#   <chr>                                             <int>
# 1 Accountability                                        1
# 2 Accountability in Governance Structures               1
# 3 Accountability in Governance Structures               2
# 4 Accountability in Governance Structures               3
# 5 Algorithmic Error amp; Bias                              1
# 6 Algorithmic Error amp; Bias                              2
# 7 Community data                                        1
# 8 Community data                                        2
# 9 Community data                                        3
#10 Community data                                        4
# … with 70 more rows