R 为向量或列中的每个元素创建新的TIBLES

R 为向量或列中的每个元素创建新的TIBLES,r,dataframe,tibble,R,Dataframe,Tibble,我有一个名为sections的tibble/dataframe,我想用它来创建几个新的tibble/dataframe。我想迭代每一行,并为每一行创建一个新的TIBLE。第一列提供了新TIBLE的名称,第二列和第三列提供了在另一个名为my\u text的TIBLE上使用的索引 sections <- structure(list(sections = c("cash_and_bank_sweep", "money_market_funds_non-sweep",

我有一个名为
sections
的tibble/dataframe,我想用它来创建几个新的tibble/dataframe。我想迭代每一行,并为每一行创建一个新的TIBLE。第一列提供了新TIBLE的名称,第二列和第三列提供了在另一个名为
my\u text
的TIBLE上使用的索引

sections <- structure(list(sections = c("cash_and_bank_sweep", "money_market_funds_non-sweep", 
                                    "equities"), 
                       begin_row = c(325L, 345L, 357L), 
                       end_row = c(345L, 357L, 384L)), 
                  class = c("tbl_df", "tbl", "data.frame"), 
                  row.names = c(NA, -3L))

有什么方法可以通过循环或其他构造有效地实现这一点吗?

我们可以使用
pmap
创建
tible
s的
列表,如果我们需要作为全局环境中的单个对象(不推荐),请使用
list2env

library(purrr)
lst1 <- pmap(sections[-1], ~ tibble(Strings = my_text$Strings[..1:..2]))
names(lst1) <- sections[[1]]

list2env(lst1, .GlobalEnv)

base R
中,可以使用
Map

lst1 <- Map(function(i, j) data.frame(Strings = my_text$Strings[i:j]), 
            sections$begin_row, sections$end_row)
names(lst1) <- sections[[1]]

我们可以在
begin\u row
end\u row
之间创建一个序列,以长格式获取数据,并在添加
row\u number()
列后,使用
my\u text
列进行
内部连接

library(tidyverse)

sections %>%
  mutate(value = map2(begin_row, end_row, `:`)) %>%
  unnest(value) %>%
  select(-begin_row, -end_row) %>%
  inner_join(my_text %>% mutate(row = row_number()), by = c('value' = 'row'))

# A tibble: 62 x 3
#  sections            value Strings
#   <chr>               <int> <chr>  
# 1 cash_and_bank_sweep   325 e      
# 2 cash_and_bank_sweep   326 n      
# 3 cash_and_bank_sweep   327 e      
# 4 cash_and_bank_sweep   328 k      
# 5 cash_and_bank_sweep   329 k      
# 6 cash_and_bank_sweep   330 q      
# 7 cash_and_bank_sweep   331 a      
# 8 cash_and_bank_sweep   332 z      
# 9 cash_and_bank_sweep   333 m      
#10 cash_and_bank_sweep   334 a      
# … with 52 more rows 
库(tidyverse)
部分%>%
突变(值=map2(开始行,结束行,`:`))%>%
unnest(值)%%>%
选择(-begin\u row,-end\u row)%>%
内部连接(my_text%>%mutate(row=row_number()),by=c('value'='row'))
#A tibble:62 x 3
#节值字符串
#                     
#1现金和银行扫描325 e
#2现金和银行扫描326 n
#3现金和银行扫描327 e
#4现金和银行汇款328 k
#5现金和银行存款329 k
#6现金和银行结算330 q
#7现金和银行扫描331 a
#8现金和银行扫描332 z
#9现金和银行汇款333 m
#10现金和银行扫描334 a
#…还有52行

这将返回一个包含所有所需行的单个数据帧,如果需要单独的数据帧,请在最后一步后的链中添加
%%>%group\u split(sections)
,即
internal\u join

哇,回答得很好。您的第一种方法非常有效,我将尝试学习这种方法。谢谢你的多个答案。
library(purrr)
lst1 <- pmap(sections[-1], ~ tibble(Strings = my_text$Strings[..1:..2]))
names(lst1) <- sections[[1]]

list2env(lst1, .GlobalEnv)
lst1 <- map2(sections$begin_row, sections$end_row,
             ~ tibble(Strings = my_text$Strings[.x:.y]))
names(lst1) <- sections[[1]]
lst1 <- Map(function(i, j) data.frame(Strings = my_text$Strings[i:j]), 
            sections$begin_row, sections$end_row)
names(lst1) <- sections[[1]]
lst1 <- vector('list', nrow(sections))
names(lst1) <- sections[[1]]
for(i in seq_along(lst1)) {
    lst1[[i]] <- data.frame(Strings = my_text$Strings[sections$begin_row[i]:sections$end_row[i]])
   }
library(tidyverse)

sections %>%
  mutate(value = map2(begin_row, end_row, `:`)) %>%
  unnest(value) %>%
  select(-begin_row, -end_row) %>%
  inner_join(my_text %>% mutate(row = row_number()), by = c('value' = 'row'))

# A tibble: 62 x 3
#  sections            value Strings
#   <chr>               <int> <chr>  
# 1 cash_and_bank_sweep   325 e      
# 2 cash_and_bank_sweep   326 n      
# 3 cash_and_bank_sweep   327 e      
# 4 cash_and_bank_sweep   328 k      
# 5 cash_and_bank_sweep   329 k      
# 6 cash_and_bank_sweep   330 q      
# 7 cash_and_bank_sweep   331 a      
# 8 cash_and_bank_sweep   332 z      
# 9 cash_and_bank_sweep   333 m      
#10 cash_and_bank_sweep   334 a      
# … with 52 more rows