在R中将data.frame变成较小的data.frame列表

时间:2019-06-06 06:50:34

标签: r loops dataframe

假设我有一个像THIS这样的data.frame(或在下面查看我的代码)。如您所见,在每隔一定数量的连续行之后,会有一行包含所有NA的行。

我想知道如何基于split的每一行NA THIS data.frame?

例如,在下面的代码中,我希望将原始data.frame split分成3个较小的data.frame,因为原始data.frame中有两行NA

这是我没有成功的尝试:

## The original data.frame:
DF <- read.csv("https://raw.githubusercontent.com/izeh/i/master/m.csv", header = T) 

## the index number of rows with "NA"s; Here rows 7 and 14:
b <- as.numeric(rownames(DF[!complete.cases(DF), ])) 

## split DF by rows that have "NA"s; that is rows 7 and 14:
split(DF, b)

2 个答案:

答案 0 :(得分:1)

如果我们还需要NA行,请在“ study.name”列上用cumsum创建一个组,该组为空白(或NA

library(dplyr)
DF %>% 
   group_split(grp = cumsum(lag(study.name == "", default = FALSE)), keep = FALSE)

或与base R

split(DF, cumsum(c(FALSE, head(DF$study.name == "", -1))))

或与NA

i1 <- rowSums(is.na(DF))== ncol(DF)
split(DF, cumsum(c(FALSE, head(i1, -1))))

或基于“ b”

DF1 <- DF[setdiff(seq_len(nrow(DF)), b), ]
split(DF1, as.character(DF1$study.name))

答案 1 :(得分:0)

您可以在b中按行顺序查找DF的出现,并使用cumsum创建组。

split(DF, cumsum(seq_len(nrow(DF)) %in% b))