Превращение data.frame в список меньших data.frames в R - PullRequest
1 голос
/ 06 июня 2019

Предположим, у меня есть data.frame вроде ЭТОГО ( или см. Мой код ниже ).Как вы можете видеть, после каждого некоторого числа непрерывных строк есть строка со всеми NA с.

Мне было интересно, как я мог split ЭТО data.frame, основанный на каждой строке NA?

Например, в моем коде ниже я хочу, чтобы мой оригинальный data.frame был split в 3 меньших data.frames, так как есть 2строки 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 ]

1 голос
/ 06 июня 2019

Если нам также нужны строки NA, создайте группу с cumsum в столбце «study.name», который будет пустым (или 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))
0 голосов
/ 06 июня 2019

Вы можете найти вхождение b в последовательности строк в DF и использовать cumsum для создания групп.

split(DF, cumsum(seq_len(nrow(DF)) %in% b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...