有条件地将字符串在多个行上连接起来

5
我已从一个包含多行字符串的PDF中提取了多个表格。我使用了tabulizer包中的extract_table()函数,唯一的问题是字符串被导入为分开的行。
例如:
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个回答

4
一种使用 tidyverse 的方式是将 action 列中的前一个非-NA值填充,然后按 Action 进行 group_by,最后将 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        

1
一个基本的 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

1
这是一种使用 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

或者使用来自zoo的na.locf。
library(zoo)
setDT(df1)[, .(description = paste(description, collapse = ' ')),
              .(action = na.locf(action))]

数据

df1 <- data.frame(action, description)

0
你可以这样使用 zoodplyr 包:
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 = ' '))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接