Как передать столбец имен файлов в mutate и вернуть количество столбцов в dplyr

#r #dplyr #rlang

#r #dplyr #rlang

Вопрос:

У меня есть следующая функция

 
colr <- function(file){
  a <- file %>% 
    read_xlsx() 

  ncol(a)
}
 

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

итак, мой tibble(file.list) — это

 > file.list
   <chr>
   file_a.xlsx
   file_b.xlsx
   file_c.xlsx

 

Я хотел бы следующее

 > file.list       ncols
   <chr>          <int>
   file_a.xlsx      10
   file_b.xlsx      10
   file_c.xlsx       2

 

Это то, что я пробовал

 tibble(file.list) %>% 
  mutate(ncols =  colr(file.list))
 

но я получил сообщение об ошибке

Ошибка: path должно быть строкой

затем я попробовал использовать quo

 tibble(file.list) %>% 
  mutate(ncols =  colr(quo(file.list)))
 

В итоге я столкнулся с той же ошибкой.

Что я делаю не так?

Комментарии:

1. Первое, что нужно проверить, работает ли это file.list[1] %>% read_xlsx(.,range = cell_cols("A:Z")) %>% ncol ? Также вам может потребоваться указать полный путь к файлам xlsx.

2. colr Работает ли, когда вы передаете ему одно имя файла в виде строки? Например, . colr("file_a.xlsx")

3. Я действительно получаю целое число, возвращаемое с помощью colr("file_a.xlsx")

4. @RonakShah file.list[1] %>% read_xlsx() %>% ncol работает

5. purrr dplyr Выполняется ли этот код с помощью и? tibble(file.list) %>% mutate(ncols = map_int(file.list, colr))

Ответ №1:

Как предложено в комментарии @Lyngbakr, мы можем использовать map_int или rowwise для каждого file.list

 library(dplyr)
library(purrr)

tibble::tibble(file.list) %>% 
       mutate(ncols =  map_int(file.list, colr))


tibble::tibble(file.list) %>% 
         rowwise() %>%
         mutate(ncols =  colr(file.list))
 

Комментарии:

1. colr возвращает целое число, так что не так ли map_int ?

2. да map_int , было бы лучше. Также я заметил, что вы опубликовали комментарий ранее. Я не против удалить ответ. Вы можете опубликовать это как свой ответ. 🙂

3. Это было почти в то же время, поэтому удалять не нужно! Тем не менее, спасибо.