Измените переменную для многих строк в группе на основе одной строки R

#r #dplyr

Вопрос:

Я хочу закодировать новую переменную для нескольких строк в группе на основе одной строки в группе и не нахожу рабочего решения.

Минимальный рабочий пример:

 df <- data.frame("participant" = c("1", "1", "1", "1", "1", "1", "1", "1", 
                                   "2", "2", "2", "2", "2", "2", "2", "2"), 
                 "group" = c("1111", "1111", "1111", "1111", "1113", "1113", "1113", "1114",
                             "1111", "1111", "1113", "1113", "1113", "1113", "1113", "1113"),
                 "item" = c("a", "b", "c", "d", "e", "f", "g", "h",
                            "i", "j", "k", "l", "m", "n", "o", "p"),
                 "value" = c("xyz", "hlm", "test", "nop", "test", "nop", "hlm", "test",
                            "hlm", "test", "xyz", "xyz", "test", "xyz", "nop", "xyz"),
                 "type" = c("1", "2", "1", "2", "2", "1", "1", "2",
                            "1", "1", "2", "2", "2", "3", "1", "1"))
 

Я хочу 1) сгруппировать по участникам и группам, 2) проверить тип каждого элемента, имеющего значение == «тест», затем 3) закодировать новый тип столбца test_type, который распространяет тип каждого «теста» по всем строкам в одной и той же комбинации участника/группы.

Конечный результат должен выглядеть так:

 df$test_type <- c("1", "1", "1", "1", "2", "2", "2", "2",
                   "1", "1", "2", "2", "2", "2", "2", "2")
 

Какие-нибудь советы?

Ответ №1:

Один из вариантов состоит в том, чтобы подмножество «типа», соответствующего «тесту», в столбце «значение» после группировки по «участнику» и «группе».

 library(dplyr)
df %>% 
   group_by(participant, group) %>% 
   mutate(test_type = type[value %in% 'test']) %>%
   ungroup
 

-выход

 # A tibble: 16 × 6
   participant group item  value type  test_type
   <chr>       <chr> <chr> <chr> <chr> <chr>    
 1 1           1111  a     xyz   1     1        
 2 1           1111  b     hlm   2     1        
 3 1           1111  c     test  1     1        
 4 1           1111  d     nop   2     1        
 5 1           1113  e     test  2     2        
 6 1           1113  f     nop   1     2        
 7 1           1113  g     hlm   1     2        
 8 1           1114  h     test  2     2        
 9 2           1111  i     hlm   1     1        
10 2           1111  j     test  1     1        
11 2           1113  k     xyz   2     2        
12 2           1113  l     xyz   2     2        
13 2           1113  m     test  2     2        
14 2           1113  n     xyz   3     2        
15 2           1113  o     nop   1     2        
16 2           1113  p     xyz   1     2           
 

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

1. Извините, я вижу, что мой пример немного вводил в заблуждение. Сейчас я его отредактировал. Есть не только типы NA, они также могут быть заполнены, но мы заботимся о типе только тогда, когда значение==»тест». Таким образом, здесь задействована некоторая фильтрация, но фильтрация типа mutate(test_type = тип[значение==»тест»]) выдает ошибку.

2. @user9974638 с вашими обновленными данными обновление в моем решении работает

3. @user9974638 я не получаю никаких ошибок с type[value == 'test'] type[value %in% 'test'] приведенным вами примером или с ним. Поскольку вы не предоставили сообщение об ошибке, оно также неясно

4. Я предполагаю, что в каждой группе есть только один «тест»

5. Теперь это работает! Спасибо! Извините, возник конфликт между dplyr/plyr.