как пометить строки в различных условиях в R - PullRequest
0 голосов
/ 12 июня 2018

У меня следующий фрейм данных в R

   ID      Name1     Name2      Name3     Name4    Name5
   1       abc       NA         der       def      NA
   2       NA        NA         NA        NA       NA
   3       abc       def        rtg       der      ret
   4       rty       NA         NA        NA       NA

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

Мой желаемый фрейм данных будет

  ID      Name1     Name2      Name3     Name4    Name5   Flag
   1       abc       NA         der       def      NA     Partial
   2       NA        NA         NA        NA       NA     No
   3       abc       def        rtg       der      ret    Yes
   4       rty       NA         NA        NA       NA     Partial

Как я могу это сделатьэто в R?

Ответы [ 5 ]

0 голосов
/ 12 июня 2018

Другое tidyverse решение с использованием dplyr::case_when

df %>%
    mutate(
        NA_count = apply(., 1, function(x) sum(is.na(x))),
        Flag = case_when(
            NA_count == 0 ~ "Yes",
            NA_count < ncol(df) - 1 ~ "Partial",
            TRUE ~ "No")) %>%
    select(-NA_count)
#  ID Name1 Name2 Name3 Name4 Name5    Flag
#1  1   abc  <NA>   der   def  <NA> Partial
#2  2  <NA>  <NA>  <NA>  <NA>  <NA>      No
#3  3   abc   def   rtg   der   ret     Yes
#4  4   rty  <NA>  <NA>  <NA>  <NA> Partial
0 голосов
/ 12 июня 2018

Явный не элегантный способ ... использование dplyr и допущение, что столбцы - это символы

df2 <- df %>% 
  mutate(flag= ifelse(is.na(Name1) | is.na(Name2) | is.na(Name3) | 
                      is.na(Name4) | is.na(Name5), "Partial", "Yes" )) %>%
  mutate(flag= ifelse(is.na(Name1) & is.na(Name2) & is.na(Name3) & 
                      is.na(Name4) & is.na(Name5), "No", flag))
0 голосов
/ 12 июня 2018
df$flag <- ifelse(rowSums(is.na(df)) == dim(df)[2] - 1, "NO", ifelse(rowSums(!is.na(df)) == dim(df)[2], "YES", "Partial"))

 ID Name1 Name2 Name3 Name4 Name5    flag
1  1   abc  <NA>   der   def  <NA> Partial
2  2  <NA>  <NA>  <NA>  <NA>  <NA>      NO
3  3   abc   def   rtg   der   ret     YES
4  4   rty  <NA>  <NA>  <NA>  <NA> Partial
0 голосов
/ 12 июня 2018

Или:

d <- read.table(text = "ID      Name1     Name2      Name3     Name4    Name5
   1       abc       NA         der       def      NA
                2       NA        NA         NA        NA       NA
                3       abc       def        rtg       der      ret
                4       rty       NA         NA        NA       NA",
                header = TRUE, stringsAsFactors = FALSE)

d$Flag <- apply(d[ , grepl("Name", colnames(d))], 1, 
                function(x) ifelse(all(is.na(x)), "No",
                                   ifelse(any(is.na(x)), "Yes", "Partial") ))
d
0 голосов
/ 12 июня 2018

Вы можете легко это сделать, посчитав значения rowWise na и последовательно связав 2 оператора if_else:

library(tidyverse)
df %>%
  mutate(NA_counter = rowSums(is.na(df))) %>%
  mutate(Flag = if_else(NA_counter == 5, "No", 
                    if_else(NA_counter > 0, "Partial", "Yes")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...