【问题标题】:R rbind a data frame to a previous dataframe (based on condition)R 将数据帧绑定到前一个数据帧(基于条件)
【发布时间】:2021-09-04 15:13:39
【问题描述】:

我有一个包含超过 17,000 个数据帧的列表。

我无法在提取数据之前将它们全部绑定在一起,因为每个 df 代表一个人的信息。

一些 dfs 只是前一个 df 的延续(例如,Df[[1001]] 是 Df[[1000]] 上呈现的数据的延续。

有没有办法将第一行 df 绑定到紧接之前索引的 df(基于条件)?

输入示例:

df1 <- data.frame(text = c("Name: Joseph", "a", "b"))
df2 <- data.frame(text = c("c", "d"))
df3 <- data.frame(text = c("Name: Paul", "e", "f"))
df4 <- data.frame(text = c("Name: Ian", "g", "h"))
df5 <- data.frame(text = c("k", "l"))

df_list <- list(df1, df2, df3, df4, df5)

期望的结果:

[[1]] text "Name: Joseph", "a", "b", "c", "d" 

[[2]] text "Name: Paul", "e", "f"

[[3]] text "Name: Ian", "g", "h", "k", "l"

我可以隔离必须用这段代码绑定的dfs:

library(purrr)

continue <- keep(df_list, ~all(!str_detect(.x$text, "Na.+")))

谢谢。

【问题讨论】:

  • 你好阿克鲁姆。我将编辑信息:

标签: r list dataframe conditional-statements rbind


【解决方案1】:

我们可以使用tidyverse 方法

  1. list 元素绑定到一个数据集 - bind_rows
  2. 根据 'text' 中存在的 'Name:' 子字符串创建分组列
  3. 将元素粘贴到“文本”中 - toString 由 2 中创建的组
  4. 使用pull 将汇总输出提取为向量
  5. 如果需要,请转换为 list - as.list
library(dplyr)
library(stringr)
bind_rows(df_list) %>% 
   group_by(grp = cumsum(str_detect(text, 'Name:'))) %>%  
   summarise(out = toString(text)) %>% 
   pull(out) %>%
   as.list

-输出

[[1]]
[1] "Name: Joseph, a, b, c, d"

[[2]]
[1] "Name: Paul, e, f"

[[3]]
[1] "Name: Ian, g, h, k, l"

注意:上面的输出是一个字符串。如果我们需要vector,只需包装list 而不是toString

bind_rows(df_list) %>% 
   group_by(grp = cumsum(str_detect(text, 'Name:'))) %>%  
   summarise(out = list(text)) %>% 
   pull(out) 

-输出

[[1]]
[1] "Name: Joseph" "a"            "b"            "c"            "d"           

[[2]]
[1] "Name: Paul" "e"          "f"         

[[3]]
[1] "Name: Ian" "g"         "h"         "k"         "l"  

【讨论】:

    【解决方案2】:

    基础 R 选项 -

    tmp <- do.call(rbind, df_list)
    split(tmp, cumsum(grepl('Name', tmp$text)))
    
    #$`1`
    #          text
    #1 Name: Joseph
    #2            a
    #3            b
    #4            c
    #5            d
    
    #$`2`
    #        text
    #6 Name: Paul
    #7          e
    #8          f
    
    #$`3`
    #        text
    #9  Name: Ian
    #10         g
    #11         h
    #12         k
    #13         l
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2018-10-03
      • 1970-01-01
      • 2018-06-07
      • 2018-01-28
      • 2018-06-25
      • 1970-01-01
      相关资源
      最近更新 更多