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

Идентификация строк с одинаковой последовательностью при игнорировании отсутствующих данных в R

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

Я создал пример набора данных, чтобы упростить задачу:

ID <- c(1,2,3,4,5,6,7,8,9,10)
S1 <- c("Education", "Employment", "Education", "Education", "Education", "Education", "Education", "Education", "Education", "Education")
S2 <- c("Education", "Employment", "Education", "Unemployed", "Education", "Education", "Employment", "Education", "Education", "Education")
S3 <- c("Education", "Employment", "NA", "Unemployed", "Education", "Employment", "Employment", "NA", "Education", "Education")
S4 <- c("Education", "Employment", "Education", "Unemployed", "Education", "Employment", "Employment", "NA", "Education", "Education")
S5 <- c("Education", "Employment", "Education", "Unemployed", "Education", "Employment", "Employment", "NA", "Education", "Education")
df <- data.frame(ID, S1, S2, S3, S4, S5)
df

   ID         S1         S2         S3         S4         S5
1   1  Education  Education  Education  Education  Education
2   2 Employment Employment Employment Employment Employment
3   3  Education  Education         NA  Education  Education
4   4  Education Unemployed Unemployed Unemployed Unemployed
5   5  Education  Education  Education  Education  Education
6   6  Education  Education Employment Employment Employment
7   7  Education Employment Employment Employment Employment
8   8  Education  Education         NA         NA         NA
9   9  Education  Education  Education  Education  Education
10 10  Education  Education  Education  Education  Education

В идеале я мог бы отметить или оставить только наблюдения ID=c("4", "6", "7").

Я попробовал пару подходов:

Я попытался подсчитать последовательные состояния, но это не учитывает отдельные идентификаторы.

library(data.table)

setDT(df_long)
df_long[, employed := (S=="Employment")
   ][, e.length := with(rle(employed), rep(lengths,lengths))
     ][employed == 0, e.length := 0]

df_long[, education := (S=="Education")
        ][, edu.length := with(rle(education), rep(lengths,lengths))
          ][education == 0, edu.length := 0]
df_long

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

df$employed[df$S1=="Education" & df$S2=="Education" & df$S3=="Education" & df$S4=="Education" & df$S5=="Education"] <- 1
df$employed

Любая помощь будет принята с благодарностью.

08.11.2018

  • Также можно векторизовать следующим образом which(rowSums((df[, 2] == df[, -(1:2)]) + (df[, -(1:2)] == "NA")) < 4) (но только если вы создаете свои данные при указании , stringsAsFactors = FALSE) 08.11.2018

Ответы:


1

Это супер просто:

df[df == "NA"] <- NA

df$keep <- lengths(apply(df[,-1],1, table)) > 1

#> which(df$keep)
#[1] 4 6 7
08.11.2018

2

У меня было похожее решение, но без table:

df[df == "NA"] <- NA
df$to.keep <- apply(df[, -1], 1, function(x) {
  !any(is.na(x)) & length(unique(x)) > 1
})

> which(df$to.keep)
[1] 4 6 7
08.11.2018
  • пожалуйста, добавьте S6 <- c("Education", "Employment", "Education", "Unemployed", "Education", "Employment", "Employment", "EMP", "Education", "Education") в data.frame. Вы увидите, что ваше решение не сработает. 08.11.2018

  • 3
    ID <- c(1,2,3,4,5,6,7,8,9,10)
    S1 <- c("Education", "Employment", "Education", "Education", "Education", "Education", "Education", "Education", "Education", "Education")
    S2 <- c("Education", "Employment", "Education", "Unemployed", "Education", "Education", "Employment", "Education", "Education", "Education")
    S3 <- c("Education", "Employment", "NA", "Unemployed", "Education", "Employment", "Employment", "NA", "Education", "Education")
    S4 <- c("Education", "Employment", "Education", "Unemployed", "Education", "Employment", "Employment", "NA", "Education", "Education")
    S5 <- c("Education", "Employment", "Education", "Unemployed", "Education", "Employment", "Employment", "NA", "Education", "Education")
    S6 <- c("Education", "Employment", "Education", "Unemployed", "Education", "Employment", "Employment", "EMP", "Education", "Education")
    df <- data.frame(ID, S1, S2, S3, S4, S5,S6)
    

    Добавлен S6 также из ваших комментариев, где Андре отвечает, что не может правильно его обозначить.

    library(dplyr)
    df[df == "NA"] <- NA
    
    df$Flag_NA = ifelse(apply(df %>% select(-ID),1,function(x) any(is.na(x))),'No','Yes')
    df$Flag_Uniform = ifelse(apply(df %>% select(-ID,-Flag_NA), 1, function(x)length(unique(x))) == 1,'No','Yes')
    df = df %>% mutate(Flag_keep = ifelse(Flag_NA == Flag_Uniform,"Yes","No"))
    
    df
       ID         S1         S2         S3         S4         S5         S6 Flag_NA Flag_Uniform Flag_keep
    1   1  Education  Education  Education  Education  Education  Education     Yes           No        No
    2   2 Employment Employment Employment Employment Employment Employment     Yes           No        No
    3   3  Education  Education       <NA>  Education  Education  Education      No          Yes        No
    4   4  Education Unemployed Unemployed Unemployed Unemployed Unemployed     Yes          Yes       Yes
    5   5  Education  Education  Education  Education  Education  Education     Yes           No        No
    6   6  Education  Education Employment Employment Employment Employment     Yes          Yes       Yes
    7   7  Education Employment Employment Employment Employment Employment     Yes          Yes       Yes
    8   8  Education  Education       <NA>       <NA>       <NA>        EMP      No          Yes        No
    9   9  Education  Education  Education  Education  Education  Education     Yes           No        No
    10 10  Education  Education  Education  Education  Education  Education     Yes           No        No
    
    08.11.2018
    Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..