Выбор столбцов на основе пропущенных значений в каждой строке - PullRequest
2 голосов
/ 27 марта 2019

Я хотел бы знать (для каждой строки), к каким столбцам относится любой NA в моих данных. Цель состоит в том, чтобы создать новый столбец / переменную, в которой перечислены имена столбцов, для которых данные показывают NA, для этой конкретной строки, предпочтительно с использованием dplyr.

Используя эти фиктивные данные,

data = tibble(var_1 = c(NA, 4, 5, 6, 7), var_2 = c(4, 5, 6, 7, 8), var_3 = c(NA, NA, NA, 3, 5))

Я хотел бы создать столбец отсутствует_кол:

  var_1 var_2 var_3       missing_col
1    NA     4    NA  "var_1", "var_3"             
2     4     5    NA           "var_3"
3     5     6    NA           "var_3"
4     6     7     3                NA
5     7     8     5                NA

Мой подход до сих пор заключался в том, чтобы использовать функцию rowwise () в сочетании с mutate и вложенным select_if () и функцией. Однако ни одна из функций, которые я пробовал до сих пор, не позволяла мне рассматривать только каждую строку отдельно (в отличие от всего столбца). Ниже я включил общую структуру моего подхода.

data %>% 
  rowwise() %>%
  mutate(missing_col = select_if(function(x) ... )) %>%
  names()

Будем благодарны за любые указания относительно соответствующей функции.

Ответы [ 4 ]

1 голос
/ 27 марта 2019
> data %>% 
+   mutate(missing_col = apply(., 1, function(x) which(is.na(x)))  %>% 
+            map_chr(., function(x) if_else(length(x)==0, 
+                                           "NA", 
+                                           paste(names(x), collapse=", "))))
# A tibble: 5 x 4
  var_1 var_2 var_3 missing_col 
  <dbl> <dbl> <dbl> <chr>       
1    NA     4    NA var_1, var_3
2     4     5    NA var_3       
3     5     6    NA var_3       
4     6     7     3 NA          
5     7     8     5 NA   
1 голос
/ 27 марта 2019

Вы можете попробовать это:

#Unlist the results from apply
missing_col=unlist(x=apply(X=data, MARGIN=1, FUN=function(x){

  #Get the names of the rows which have NA
  NamesNA=names(which(is.na(x)))

  #If there's no NA then replace the 'character(0)' for NA.
  if(length(NamesNA)!=0){

    #Concatenate names if there are more than one
    paste0(NamesNA, collapse=",")

  }else{

    #Replace 'character(0)'
    NA  

  }
})
)

#Add column with desired output
data$missing_col=missing_col

Это дает желаемый результат:

# A tibble: 5 x 4
  var_1 var_2 var_3 missing_col
  <dbl> <dbl> <dbl> <chr>      
1    NA     4    NA var_1,var_3
2     4     5    NA var_3      
3     5     6    NA var_3      
4     6     7     3 NA         
5     7     8     5 NA   
0 голосов
/ 28 марта 2019

Возможное решение - использовать apply непосредственно в mutate вместо rowwise.Возможно, эквивалентный подход возможен с rowwise, но мой опыт работы с этой функцией ограничен.Второй mutate необходим, только если вам нужно NA для строк без NA.

data %>% 
  mutate(missing_col = apply(., 1, function(x) names(.)[is.na(x)] %>% paste(collapse = ", "))) %>% 
  mutate(missing_col = if_else(missing_col == "", NA_character_, missing_col))
0 голосов
/ 27 марта 2019

Это не аккуратный способ, но приложение кажется достаточно простым:

data = tibble(var_1 = c(NA, 4, 5, 6, 7), var_2 = c(4, 5, 6, 7, 8), var_3 = c(NA, NA, NA, 3, 5))

data$missing = apply(data,1,function(x) names(x)[is.na(x)])

, которое выдает:

data
# A tibble: 5 x 4
  var_1 var_2 var_3 missing  
  <dbl> <dbl> <dbl> <list>   
1 NA     4.00 NA    <chr [2]>
2  4.00  5.00 NA    <chr [1]>
3  5.00  6.00 NA    <chr [1]>
4  6.00  7.00  3.00 <chr [0]>
5  7.00  8.00  5.00 <chr [0]>

Таким образом, каждый элемент отсутствующего столбца являетсясписок, содержащий символьный вектор

data$missing[[1]]
[1] "var_1" "var_3"
data$missing[[1]][1]
[1] "var_1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...