Вот код, который считывает данные с удаленного URL, а затем находит строки, которые NA для всех столбцов в пяти различных подмножествах столбцов. Таблица вывода miss_recode дает ID для этих строк вместе с переменной recode_cols, которая является меткой для какое подмножество строк - это все NA.

suppressMessages(library(tidyverse))

urlRemote_path  <- "https://raw.githubusercontent.com/"
github_path <- "DSHerzberg/TOD-R/master/INPUT-FILES/"
fileName_path   <- "SO-data.csv"

input <- suppressMessages(read_csv(url(
  str_c(urlRemote_path, github_path, fileName_path)
)))

miss1 <- input %>%
  filter(across(c(i001:i035),
                ~ is.na(.))) %>% 
  mutate(recode_cols = "i001:i035")
miss2 <- input %>%
  filter(across(c(i036:i060),
                ~ is.na(.))) %>% 
  mutate(recode_cols = "i036:i060")
miss3 <- input %>%
  filter(across(c(i061:i100),
                ~ is.na(.))) %>% 
  mutate(recode_cols = "i061:i100")
miss4 <- input %>%
  filter(across(c(i101:i130),
                ~ is.na(.))) %>% 
  mutate(recode_cols = "i101:i130")
miss5 <- input %>%
  filter(across(c(i131:i165),
                ~ is.na(.))) %>% 
  mutate(recode_cols = "i131:i165")

miss_recode <- bind_rows(
  miss1, 
  miss2, 
  miss3, 
  miss4, 
  miss5
) %>% 
  select(ID, recode_cols)

Я хочу объединить код с purrr::map. В следующем фрагменте показаны мои попытка, но возвращает Error: Can't subset columns that don't exist.

vec <- c("i001:i035", "i036:i060", "i061:i100", "i101:i130", "i131:i165")

miss_recode_map <- vec %>% 
  map_df(~
        input %>%
        filter(across(c(!!sym(.x)),
                      ~ is.na(.))) %>% 
        mutate(recode_cols = .x) %>% 
          select(ID, recode_cols)
        )

Ясно, что я неправильно понимаю NSE. Это похоже на новый вопрос относится к across(), который теперь доступен в dplyr 1.0.0. В этом например, кажется, что одно использование .x требует, чтобы элементы vec были цитируется, а другое использование .x требует, чтобы эти элементы не заключались в кавычки.

Заранее благодарю за любую помощь.

2
DSH 25 Июн 2020 в 06:26

1 ответ

Лучший ответ

Вы не можете преобразовать "i001:i035" как символ, вам действительно нужно его проанализировать.

library(dplyr)
library(rlang)

purrr::map_df(vec, ~input %>%
                    filter(across(!!parse_expr(.x),~ is.na(.))) %>%
                    mutate(recode_cols = .x) %>%
                    select(ID, recode_cols))

# A tibble: 8 x 2
#      ID recode_cols
#   <dbl> <chr>      
#1 201010 i036:i060  
#2 214063 i036:i060  
#3 262050 i036:i060  
#4 262063 i036:i060  
#5 205036 i061:i100  
#6 231007 i061:i100  
#7 208014 i101:i130  
#8 231014 i131:i165  
1
Ronak Shah 25 Июн 2020 в 03:55