Условный tidyr :: complete () с точностью до максимального значения - PullRequest
1 голос
/ 15 марта 2019

Я хотел бы использовать 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 & software",    5,
"In-house technical capacity",  5,
"Infrastructure procurement",   5,
"Algorithmic Error & 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 ().

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Вот подход 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
1 голос
/ 15 марта 2019

Вы также можете использовать 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 & Bias                              1
# 6 Algorithmic Error & Bias                              2
# 7 Community data                                        1
# 8 Community data                                        2
# 9 Community data                                        3
#10 Community data                                        4
# … with 70 more rows
1 голос
/ 15 марта 2019

Одна 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 & Bias                              1
 6 Algorithmic Error & Bias                              2
 7 Community data                                        1
 8 Community data                                        2
 9 Community data                                        3
10 Community data                                        4
...