R 如何根据特定字符将一个数据帧划分为几个数据帧?

R 如何根据特定字符将一个数据帧划分为几个数据帧?,r,R,如何根据特定字符将一个数据帧划分为几个数据帧 df <- tibble(NumberA = c(5,3,2,0,"\\#",2,0,"\\#",3,1,1,3,1,0,"\\#"), NumberB = c(5,6,2,5,"\\#",4,3,"\\#",4,3,2,1,3,9,"\\#")) df选项1 A底座一个衬里: split(df,

如何根据特定字符将一个数据帧划分为几个数据帧

df <- tibble(NumberA = c(5,3,2,0,"\\#",2,0,"\\#",3,1,1,3,1,0,"\\#"),
             NumberB = c(5,6,2,5,"\\#",4,3,"\\#",4,3,2,1,3,9,"\\#"))
df选项1

A
底座
一个衬里:

split(df, replace(cumsum(df$NumberA == "\\#"), df$NumberA == "\\#", NA))

选项2

带有
group\u split()
dplyr
解决方案


输出


其中,
df_split
是分割后的数据。

库(dplyr)
图书馆(tidyverse)
#资料
df%总结所有(.funs=mean)%%>%突变(Var=paste0('df',Var))->dfmean
#分裂

L1我使用data.frame函数再次创建了df,functin tibble对我不起作用

但是我创建了一个列表,其中新的df被我们的索引“\ \”分割

#需要软件包
需要(dplyr)
#创建df
df%
过滤器(拆分点==F)
#创建一个空列表以在循环中存储数据帧

谢谢,如果我想得到每个data.frame中每列的平均值,该怎么办?然后将所有方法组合成一个data.frame?@AndyIan我已经用你想要的更新了解决方案:)谢谢,这很好,如果我想得到每个data.frame的每列的平均值呢?然后将所有方法组合成一个数据帧?
library(dplyr)

df %>%
  group_by(grp = cumsum(NumberA == "\\#")) %>%
  filter(NumberA != "\\#") %>%
  group_split(.keep = FALSE)
# [[1]]
# # A tibble: 4 x 2
#   NumberA NumberB
#   <chr>   <chr>  
# 1 5       5      
# 2 3       6      
# 3 2       2      
# 4 0       5      
# 
# [[2]]
# # A tibble: 2 x 2
#   NumberA NumberB
#   <chr>   <chr>  
# 1 2       4      
# 2 0       3      
# 
# [[3]]
# # A tibble: 6 x 2
#   NumberA NumberB
#   <chr>   <chr>  
# 1 3       4      
# 2 1       3      
# 3 1       2      
# 4 3       1      
# 5 1       3      
# 6 0       9
library(purrr)

map_dfr(df_split, ~ colMeans(mutate(.x, across(everything(), as.numeric))))

# # A tibble: 3 x 2
#   NumberA NumberB
#     <dbl>   <dbl>
# 1     2.5    4.5 
# 2     1      3.5 
# 3     1.5    3.67
library(dplyr)
library(tidyverse)
#Data
df <- tibble(NumberA=c(5,3,2,0,"\\#",2,0,"\\#",3,1,1,3,1,0,"\\#"),
             NumberB=c(5,6,2,5,"\\#",4,3,"\\#",4,3,2,1,3,9,"\\#"))
#Detect characters
index <- which(df$NumberA=='\\#')
#Assign var
df$Var <- NA
df$Var[index]<-1:length(index)
#Fill
df %>% fill(Var,.direction = 'up') -> df1
#Remove rows with character
df1 <- df1[-index,]
#Compute mean
df1 %>% mutate(NumberA=as.numeric(NumberA),NumberB=as.numeric(NumberB)) %>%
  group_by(Var) %>% summarise_all(.funs = mean) %>% mutate(Var=paste0('df',Var)) -> dfmean
#Split
L1 <- split(df1,df1$Var)
#Remove var
L1 <- lapply(L1,function(x) {x$Var<-NULL; return(x)})
#Dataframes
names(L1)<-paste0('df',names(L1))
list2env(L1,envir = .GlobalEnv)
df1
# A tibble: 4 x 2
  NumberA NumberB
  <chr>   <chr>  
1 5       5      
2 3       6      
3 2       2      
4 0       5   

df2
# A tibble: 2 x 2
  NumberA NumberB
  <chr>   <chr>  
1 2       4      
2 0       3  

df3
# A tibble: 6 x 2
  NumberA NumberB
  <chr>   <chr>  
1 3       4      
2 1       3      
3 1       2      
4 3       1      
5 1       3      
6 0       9  
# A tibble: 3 x 3
  Var   NumberA NumberB
  <chr>   <dbl>   <dbl>
1 df1       2.5    4.5 
2 df2       1      3.5 
3 df3       1.5    3.67
# Require packages
require(dplyr)

# Create the df
df <- data.frame(NumberA=c(5,3,2,0,"\\#",2,0,"\\#",3,1,1,3,1,0,"\\#"),
                 NumberB=c(5,6,2,5,"\\#",4,3,"\\#",4,3,2,1,3,9,"\\#"))


# Create a split point based on the special character, and filter to remains just the inter "special character lines".
df <- df %>% mutate(split_point = NumberA == "\\#",
                    block = with(rle(split_point), rep(seq_along(lengths), lengths))) %>%
    filter(split_point == F)

# Create an empty list to store the data frames inside a loop
list_df <- list()

# Unique blcks of df    
blokcs <- unique(df$block)


# Loop for create the list of data frames
for (i in 1:length(blokcs)) {
    list_df[[i]] <- df[df$block == blokcs[i], ]
}

list_df