Хобрук: Ваш путь к мастерству в программировании

Создайте новую переменную, игнорируя NA

У меня есть набор данных с несколькими переменными, которые представляют пациентов, идентификаторы лабораторий и результаты. Это выглядит примерно так:

     id    lab.1   result.1  lab.2   result.2   lab.3   result.3   lab.4    result.4
1    110   2039    0         2039    0          NA      NA         NA       NA
2    203   1778    5694      1778    908        1778    786        NA       NA
3    218   13490   579       13490   276        1067    243        13490    152
4    222   495     0         495     495        0       495        495      0
5    231   1067    966117    306    82794       NA      NA         NA       NA
6    238   2821    89        2821    NA         NA      NA         NA       NA

Проблема в том, что мне нужно создать новую переменную, которая указывает, одинакова ли лаборатория во всех переменных «лаборатории» (0/1). Результат, который я ожидаю, выглядит следующим образом:

   samelab
1  1
2  1
3  0
4  1
5  0
6  1

Однако многие переменные являются NA, и я не могу понять, как это решить, поскольку я не могу перекодировать NA, потому что это что-то значит.

Я пытался использовать df$samelab = ifelse(df$lab.1 == df$lab.2 & df$lab.3 & df$lab.4, 1, 0), но он дает результаты NA.

Буду очень признателен за любую помощь в решении этой проблемы. Спасибо!

r na
14.10.2020

  • В 4-й строке у вас есть 0 в качестве значения. Вы считаете это другим 14.10.2020

Ответы:


1

Мы можем использовать grep для подмножества столбцов, начинающихся с «lab» (или использовать startsWith). Затем мы сравниваем с первым столбцом и получаем rowSums логической матрицы, проверяем, равен ли счет количеству столбцов, меняем логический вектор на двоичный с +

df1 <- df[grep('lab', names(df))]
n1 <- rowSums(df1== df1[,1], na.rm = TRUE)
n2 <- rowSums(!is.na(df1) & df1 != 0)
df$samelab <- +(n1 == n2)

Другой вариант — проверить length из unique элементов.

+(apply(df1, 1, function(x) length(unique(x[!is.na(x)]))) == 1)

Если мы не рассмотрим 0

df$samelab <- +(apply(df1, 1, function(x) length(unique(x[!is.na(x) & x != 0]))) == 1)
df$samelab
#[1] 1 1 0 1 0 1

Или вариант с tidyverse

library(dplyr)
df %>%
   rowwise %>%
   mutate(samelab =  as.integer(n_distinct(setdiff(na.omit(c_across(
          starts_with('lab'))),
           0)) == 1))

-выход

# A tibble: 6 x 10
# Rowwise: 
#     id lab.1 result.1 lab.2 result.2 lab.3 result.3 lab.4 result.4 samelab
#  <int> <int>    <int> <int>    <int> <int>    <int> <int>    <int>   <int>
#1   110  2039        0  2039        0    NA       NA    NA       NA       1
#2   203  1778     5694  1778      908  1778      786    NA       NA       1
#3   218 13490      579 13490      276  1067      243 13490      152       0
#4   222   495        0   495      495     0      495   495        0       1
#5   231  1067   966117   306    82794    NA       NA    NA       NA       0
#6   238  2821       89  2821       NA    NA       NA    NA       NA       1
14.10.2020
  • благодарю вас!! Второй вариант сработал отлично! @akrun 14.10.2020
  • @AngélicaSantos - первый вариант, который я опубликовал до того, как проверил проблему NA. Второй и третий должны работать для этого случая 14.10.2020
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..