Слияние строк в тибле - PullRequest
6 голосов
/ 29 марта 2020

Я хотел бы перечислить все функции моего пакета в таблице.

До сих пор я извлек все функции и заголовки из пакетов справочных документов

library(magrittr)
package_info <- library(help = magrittr)$info[[2]]
package_info_tbl <- package_info %>% 
  stringr::str_split(pattern = "\\s+", n = 2, simplify = T) %>%
  tibble::as_tibble(.name_repair = "minimal")
colnames(package_info_tbl) <- c("Function", "Title")

package_info_tbl
#> # A tibble: 13 x 2
#>    Function     Title                                          
#>    <chr>        <chr>                                          
#>  1 "%$%"        magrittr exposition pipe-operator              
#>  2 "%<>%"       magrittr compound assignment pipe-operator     
#>  3 "%>%"        magrittr forward-pipe operator                 
#>  4 "%T>%"       magrittr tee operator                          
#>  5 "[[.fseq"    Extract function(s) from a functional sequence.
#>  6 "debug_fseq" Debugging function for functional sequences.   
#>  7 "debug_pipe" Debugging function for magrittr pipelines.     
#>  8 "extract"    Aliases                                        
#>  9 "freduce"    Apply a list of functions sequentially         
#> 10 "functions"  Extract the function list from a functional    
#> 11 ""           sequence.                                      
#> 12 "magrittr"   magrittr - Ceci n'est pas un pipe              
#> 13 "print.fseq" Print method for functional sequence.

Создано в 2020-03-29 с помощью пакета представьте (v0.3.0)

Я обнаружил, что некоторые строки разделяются и приводят к 2 или более строкам, если заголовок длинный. Как объединить эти строки?

Ответы [ 4 ]

6 голосов
/ 29 марта 2020

Мы можем заменить пробел значениями NA, использовать fill для замены NA предыдущим значением в столбце Function, group_by Function и создать одну каскадную строку для каждого Function.

library(dplyr)

package_info_tbl %>%
  na_if('') %>%
  tidyr::fill(Function)  %>%
  group_by(Function) %>%
  summarise(Title = paste(Title, collapse = " "))


# A tibble: 12 x 2
#   Function   Title                                                
#   <chr>      <chr>                                                
# 1 [[.fseq    Extract function(s) from a functional sequence.      
# 2 %<>%       magrittr compound assignment pipe-operator           
# 3 %>%        magrittr forward-pipe operator                       
# 4 %$%        magrittr exposition pipe-operator                    
# 5 %T>%       magrittr tee operator                                
# 6 debug_fseq Debugging function for functional sequences.         
# 7 debug_pipe Debugging function for magrittr pipelines.           
# 8 extract    Aliases                                              
# 9 freduce    Apply a list of functions sequentially               
#10 functions  Extract the function list from a functional sequence.
#11 magrittr   magrittr - Ceci n'est pas un pipe                    
#12 print.fseq Print method for functional sequence.               
1 голос
/ 29 марта 2020

Мы также можем сделать str_c

library(dplyr)
library(tidyr)
library(stringr)
package_info_tbl %>%
  na_if('') %>%
  fill(Function)  %>%
  group_by(Function) %>%
  summarise(Title = str_c(Title, collapse = " "))
1 голос
/ 29 марта 2020

Если пусто, заполните Function столбцы значением из предыдущей строки. И свернуть Title, если Function то же самое.

package_info_tbl$Function <- Reduce(function(x,y) if (y=="") x else y, package_info_tbl$Function, acc=T) %>%

package_info_tbl <- package_info_tbl %>% 
  group_by(Function) %>%
  summarise(Title = paste(Title, collapse  = " "))

Или объединить в вашу dplyr цепочку

package_info_tbl <- package_info %>% 
      stringr::str_split(pattern = "\\s+", n = 2, simplify = T) %>%
      tibble::as_tibble(.name_repair = "minimal") %>%
      setNames(., c("Function", "Title")) %>%
      mutate(Function = Reduce(function(x,y) if (y=="") x else y, Function, acc=T)) %>%
      group_by(Function) %>%
      summarise(Title = paste(Title, collapse  = " ")) %>%
      ungroup

Выход

package_info_tbl

# # A tibble: 12 x 2
#    Function   Title                                                
#    <chr>      <chr>                                                
#  1 %$%        magrittr exposition pipe-operator                    
#  2 %<>%       magrittr compound assignment pipe-operator           
#  3 %>%        magrittr forward-pipe operator                       
#  4 %T>%       magrittr tee operator                                
#  5 [[.fseq    Extract function(s) from a functional sequence.      
#  6 debug_fseq Debugging function for functional sequences.         
#  7 debug_pipe Debugging function for magrittr pipelines.           
#  8 extract    Aliases                                              
#  9 freduce    Apply a list of functions sequentially               
# 10 functions  Extract the function list from a functional sequence.
# 11 magrittr   magrittr - Ceci n'est pas un pipe                    
# 12 print.fseq Print method for functional sequence.  
0 голосов
/ 29 марта 2020

Вы можете объединить эти строки с помощью суммирования. Предварительно назначьте, какие строки принадлежат друг другу. Здесь достаточно простого locf:

library("zoo")
library(tidyr)
library(magrittr)
library(dplyr)
package_info <- library(help = magrittr)$info[[2]]
package_info_tbl <- package_info %>% 
  stringr::str_split(pattern = "\\s+", n = 2, simplify = T) %>%
  # set colnames
  `colnames<-`(c("Function", "Title")) %>% 
  tibble::as_tibble() %>% 
  # explicit NAs
  dplyr::mutate(Function = if_else(Function == "", NA_character_, Function),
                # replace NAs with prior value
                Function = zoo::na.locf(Function)) %>% 
  # paste together the strings for each function
  group_by(Function) %>% 
  summarise(Title = paste(Title, collapse = " "))
...