J'ai extrait plusieurs tableaux d'un PDF qui contient des chaînes sur plusieurs lignes. J'ai utilisé la fonction extract_table () du package tabulizer, le seul problème étant que les chaînes sont importées sous forme de lignes séparées.
par exemple
action description 1 1 a b c 2 2 a b 3 3 a b c d 4 4 a b
Je voudrais concaténer les des chaînes pour qu'elles apparaissent comme le même élément tel que:
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
J'espère que cela a du sens, apprécions toute aide!
4 Réponses :
Vous pouvez utiliser les packages zoo et dplyr comme ceci
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 = ' '))
tidyverse serait de remplir la colonne action avec la valeur non-NA précédente puis group_by Action et collez la description ensemble.
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
Une option base R
cumsum(!is.na(dat$action))) #[1] 1 1 1 2 2 3 3 3 3 4 4
Pour que aggregate fonctionne, nous devons changer action en quoi est retourné par cumsum (! is.na (dat $ action))) , c'est-à-dire
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
Voici une option avec data.table
df1 <- data.frame(action, description)
Ou en utilisant na.locf de zoo
library(zoo)
setDT(df1)[, .(description = paste(description, collapse = ' ')),
.(action = na.locf(action))]
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