R - программно определить NA столбцы и вернуть строку - PullRequest
2 голосов
/ 06 апреля 2020

У меня есть этот вектор допустимых столбцов для моего сценария

cols <- c("country", "phone", "car")

И это dataframe

test <-
  data.frame(
    id = c(1, 2, 3),
    country = c("us", NA, "uk"),
    phone = c(1, 1, NA),
    car = c(NA, 0, 1)
  )

Цель состоит в том, чтобы создать новый столбец с результатом, в котором условие будет основано только на столбцах, присутствующих в переменной cols. Если все значения для id равны NA, то res должно быть строкой ничего, если некоторые из них не являются NA, тогда мне нужно это colnames, в случае, если все столбцы не являются NA, тогда результатом должна быть строка all .

result <-
  data.frame(
    id = c(1, 2, 3),
    country = c("us", NA, NA),
    phone = c(1, 1, NA),
    car = c(NA, NA, NA),
    res = c("country, phone", "phone", "nothing")
  )

Я могу сделать это только через case_when() функцию

mutate(
    res = case_when(
      !is.na(country) & is.na(phone) & is.na(car)  ~ "country",
      T ~ "?"
    )

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

Вы можете сделать это в базе R (а не dplyr), используя код:

result$res <- apply(result[,cols],1, function(x){paste(cols[!is.na(x)], collapse=", ")})
result$res[results$res==""] <- "nothing"
0 голосов
/ 06 апреля 2020

Данные, которыми вы поделились, отличаются (test и result). Поэтому мы начнем с result, удалив столбец res.

library(dplyr)
result$res <- NULL

result %>%
  mutate_all(as.character) %>%
  tidyr::pivot_longer(cols = cols) %>%
  group_by(id) %>%
  summarise(res = toString(name[!is.na(value)])) %>%
  type.convert() %>%
  left_join(res, by = 'id') %>%
   mutate(res = case_when(res == '' ~ 'nothing', 
                           stringr::str_count(result, ',') == 
                           (length(cols) - 1) ~ 'all',
                            TRUE ~ as.character(result)))


# A tibble: 3 x 5
#     id res            country phone car  
#  <dbl> <chr>          <fct>   <dbl> <lgl>
#1     1 country, phone us          1 NA   
#2     2 phone          NA          1 NA   
#3     3 nothing        NA         NA NA   

Мы получаем данные в длинном формате, получаем имена столбцов, которые имеют значения не-NA для каждого ID. Затем мы изменяем столбец res на "all" или "nothing", если есть все или 0 совпадений соответственно.

...