Создать новый столбец в R-фрейме на основе результатов 3 других столбцов - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть фрейм данных, содержащий Id и результаты сканирования. 1 обозначается, если результат не виден при сканировании. 2 если результат виден, а вектор отсутствует, если сканирование не завершено.

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

  • В основном результат "2" является доминирующим вектором - если он появляется в строке данных, я хочу, чтобы он отображался в новом столбце
  • если «2» отсутствует, то если присутствует «1», которое должно появиться в новом столбце
  • если в каком-либо столбце нет результатов, то нет ни результата, ни NA

Я пытался сделать это в Excel и R. Я бы предпочел использовать R, поскольку я изучаю это в данный момент и хочу продолжить изучение новых применений.

Я пытался использовать

library(tidyverse)
USS_reports %>%
   mutate((filter(USSfluid=2 | CTfluid=2 | MRIfluid=2))

id  USSFluid    CTfluid MRIfluid
1       1             1        1
2       1                      1    
3       1             1        1
4       1             1 
5       1             1 
6       1             1 
7       1       
8                     1     
9       1       
10                    1       2 
11      1             2 

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

, так как вы хотите задать приоритет наивысшего значения, вы можете просто использовать apply, чтобы получить значение max для строки (MARGIN = 1) кадра данных, исключая первый столбец идентификатора ([,-1]):

USS_reports %>% mutate(summary = apply(USS_reports[,-1], MARGIN = 1, 
FUN = function(row)max(row, na.rm = TRUE))) %>%  
mutate(summary = ifelse(summary == -Inf, NA, summary))

Обратите внимание, что второй mutate необходим для замены значений -Inf, которые возвращаются max, когда все столбцы NA с NA. Чтобы это работало, ваш df должен быть числовым. Если нет, то сначала нужно сделать

USS_reports[] <- lapply(USS_reports, as.numeric)

(кстати, если вы хотите проверить на равенство в коде выше, вы должны использовать == вместо =)

0 голосов
/ 27 апреля 2018

Вот решение, которое на первый взгляд не так просто, но предназначено для масштабирования больше, чем эти 3 столбца, которые вы проверяете. Я gather отредактировал фрейм данных в длинный формат, создал одну строку для каждого идентификатора всех результатов, затем использовал case_when для проверки каждой из возможностей: есть результат с 2, есть результат с 1, или нет результата. Мне нравится case_when, чтобы избежать множества ifelse, вложенных друг в друга.

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

library(tidyverse)

df %>%
# test case with no results
    bind_rows(tibble(id = 12)) %>%
    gather(key = scan, value = result, -id) %>%
    group_by(id) %>%
    summarise(all_str = paste(result, collapse = ",")) %>%
    mutate(overall = case_when(
        str_detect(all_str, "2") ~ "2",
        str_detect(all_str, "1") ~ "1",
        T ~ "no result"
    ))

#> # A tibble: 12 x 3
#>       id all_str  overall  
#>    <dbl> <chr>    <chr>    
#>  1    1. 1,1,1    1        
#>  2    2. 1,1,NA   1        
#>  3    3. 1,1,1    1        
#>  4    4. 1,1,NA   1        
#>  5    5. 1,1,NA   1        
#>  6    6. 1,1,NA   1        
#>  7    7. 1,NA,NA  1        
#>  8    8. 1,NA,NA  1        
#>  9    9. 1,NA,NA  1        
#> 10   10. 1,2,NA   2        
#> 11   11. 1,2,NA   2        
#> 12   12. NA,NA,NA no result

Создано в 2018-04-27 пакетом Представ (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...