Условно конкатенация строк по нескольким строкам - PullRequest
0 голосов
/ 06 января 2019

Я извлек несколько таблиц из PDF, который содержит строки в несколько строк. Я использовал функцию extract_table () из пакета tabulizer, единственная проблема заключалась в том, что строки импортируются как отдельные строки.

, например

action <- c(1, NA, NA, 2, NA, 3, NA, NA, NA, 4, NA)

description <- c("a", "b", "c", "a", "b", "a", "b", "c", "d", "a", "b")

data.frame(action, description)

       action description
1       1           a
2      NA           b
3      NA           c
4       2           a
5      NA           b
6       3           a
7      NA           b
8      NA           c
9      NA           d
10      4           a
11     NA           b

Я хотел бы объединить строки, чтобы они выглядели как один и тот же элемент, например:

  action description
1      1       a b c
2      2         a b
3      3     a b c d
4      4         a b

Надеюсь, что это имеет смысл, ценю любую помощь!

Ответы [ 4 ]

0 голосов
/ 06 января 2019

Вот один вариант с data.table

library(data.table)
setDT(df1)[, .(description = paste(description, collapse = ' ')), 
                  .(action = cumsum(!is.na(action)))]
#   action description
#1:      1       a b c
#2:      2         a b
#3:      3     a b c d
#4:      4         a b

Или используя na.locf из zoo

library(zoo)
setDT(df1)[, .(description = paste(description, collapse = ' ')),
              .(action = na.locf(action))]

Данные

df1 <- data.frame(action, description)
0 голосов
/ 06 января 2019

tidyverse путь будет в fill столбец action с предыдущим значением, отличным от NA, тогда group_by Action и paste вместе description.

library(tidyverse)

df %>%
 fill(action) %>%
 group_by(action) %>%
 summarise(description = paste(description, collapse = " "))


#  action description
#   <dbl> <chr>      
#1     1. a b c      
#2     2. a b        
#3     3. a b c d    
#4     4. a b        
0 голосов
/ 06 января 2019

A base R опция

dat <- data.frame(action, description)
aggregate(
  description ~ action,
  transform(dat, action = cumsum(!is.na(dat$action))),
  FUN = paste,
  ... = collapse = " "
)
#  action description
#1      1       a b c
#2      2         a b
#3      3     a b c d
#4      4         a b

Чтобы aggregate работал, нам нужно изменить action на то, что возвращает cumsum(!is.na(dat$action))), т.е.

cumsum(!is.na(dat$action)))
#[1] 1 1 1 2 2 3 3 3 3 4 4
0 голосов
/ 06 января 2019

Вы можете использовать пакеты zoo и dplyr, например,

library(zoo)
library(dplyr)
action <- c(1, NA, NA, 2, NA, 3, NA, NA, NA, 4, NA)
description <- c("a", "b", "c", "a", "b", "a", "b", "c", "d", "a", "b")
df = data.frame(action, description)
df$action = na.locf(df$action)
df = 
    df %>% 
    group_by(action) %>% 
    summarise(description = paste(description, collapse = ' '))
...