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