Como dividir um quadro de dados?

Eu quero dividir um quadro de dados em vários frameworks menores. Isto parece uma questão muito trivial, no entanto não consigo encontrar uma solução de pesquisa na web.

Você também pode querer cortar o quadro de dados em um número arbitrário de frameworks de dados menores. Aqui, cortamos dois frameworks de dados.

 x = data.frame(num = 1:26, let = letters, LET = LETTERS) set.seed(10) split(x, sample(rep(1:2, 13))) 

 $`1` num let LET 3 3 c C 6 6 f F 10 10 j J 12 12 l L 14 14 n N 15 15 o O 17 17 q Q 18 18 r R 20 20 t T 21 21 u U 22 22 v V 23 23 w W 26 26 z Z $`2` num let LET 1 1 a A 2 2 b B 4 4 d D 5 5 e E 7 7 g G 8 8 h H 9 9 i I 11 11 k K 13 13 m M 16 16 p P 19 19 s S 24 24 x X 25 25 y Y 

Você também pode dividir um quadro de dados com base em uma coluna existente. Por exemplo, para criar três frameworks de dados com base na coluna cyl em mtcars :

 split(mtcars,mtcars$cyl) 

Se você quiser dividir um dataframe de acordo com os valores de alguma variável, sugiro usar daply() do pacote plyr .

 library(plyr) x < - daply(df, .(splitting_variable), function(x)return(x)) 

Agora, x é uma matriz de frameworks de dados. Para acessar um dos dataframes, você pode indexá-lo com o nome do nível da variável de divisão.

 x$Level1 #or x[["Level1"]] 

Eu tenho certeza que não há outras maneiras mais inteligentes de lidar com seus dados antes de dividi-los em muitos frameworks de dados.

Acabei de postar uma espécie de RFC que pode ajudá-lo: Divida um vetor em pedaços em R

 x = data.frame(num = 1:26, let = letters, LET = LETTERS) ## number of chunks n < - 2 dfchunk <- split(x, factor(sort(rank(row.names(x))%%n))) dfchunk $`0` num let LET 1 1 a A 2 2 b B 3 3 c C 4 4 d D 5 5 e E 6 6 f F 7 7 g G 8 8 h H 9 9 i I 10 10 j J 11 11 k K 12 12 l L 13 13 m M $`1` num let LET 14 14 n N 15 15 o O 16 16 p P 17 17 q Q 18 18 r R 19 19 s S 20 20 t T 21 21 u U 22 22 v V 23 23 w W 24 24 x X 25 25 y Y 26 26 z Z 

Felicidades, Sebastian

Você também pode usar

 data2 < - data[data$sum_points == 2500, ] 

Isso fará com que um dataframe com os valores onde sum_points = 2500

Dá :

 airfoils sum_points field_points init_t contour_t field_t ... 491 5 2500 5625 0.000086 0.004272 6.321774 498 5 2500 5625 0.000087 0.004507 6.325083 504 5 2500 5625 0.000088 0.004370 6.336034 603 5 250 10000 0.000072 0.000525 1.111278 577 5 250 10000 0.000104 0.000559 1.111431 587 5 250 10000 0.000072 0.000528 1.111524 606 5 250 10000 0.000079 0.000538 1.111685 .... > data2 < - data[data$sum_points == 2500, ] > data2 airfoils sum_points field_points init_t contour_t field_t 108 5 2500 625 0.000082 0.004329 0.733109 106 5 2500 625 0.000102 0.004564 0.733243 117 5 2500 625 0.000087 0.004321 0.733274 112 5 2500 625 0.000081 0.004428 0.733587 

subset() também é útil:

 subset(DATAFRAME, COLUMNNAME == "") 

Para um pacote de pesquisa, talvez o pacote de survey seja pertinente?

http://faculty.washington.edu/tlumley/survey/

A resposta que você deseja depende muito de como e por que você deseja dividir o quadro de dados.

Por exemplo, se você quiser deixar de fora algumas variables, poderá criar novos frameworks de dados a partir de colunas específicas do database. Os subscritos entre parênteses após o quadro de dados referem-se a números de linha e coluna. Confira Spoetry para uma descrição completa.

 newdf < - mydf[,1:3] 

Ou você pode escolher linhas específicas.

 newdf < - mydf[1:3,] 

E esses índices também podem ser testes lógicos, como a escolha de linhas que contêm um valor específico ou fatores com um valor desejado.

O que você quer fazer com os pedaços que sobraram? Você precisa executar a mesma operação em cada parte do database? Em seguida, você desejará garantir que os subconjuntos do quadro de dados acabem em um object conveniente, como uma lista, que o ajudará a executar o mesmo comando em cada parte do quadro de dados.

Se você quiser dividir por valores em uma das colunas, use o lapply . Por exemplo, para dividir o ChickWeight em um dataset separado para cada filhote:

 data(ChickWeight) lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,]) 

Dividir o quadro de dados parece ser contraproducente. Em vez disso, use o paradigma split-apply-combine, por exemplo, gerar alguns dados

 df = data.frame(grp=sample(letters, 100, TRUE), x=rnorm(100)) 

em seguida, divida somente as colunas relevantes e aplique a function scale() para x em cada grupo e combine os resultados (usando split< - ou ave )

 df$z = 0 split(df$z, df$grp) = lapply(split(df$x, df$grp), scale) ## alternative: df$z = ave(df$x, df$grp, FUN=scale) 

Isso será muito rápido em comparação com a divisão de datas.frames e o resultado permanecerá utilizável na análise downstream sem iteração. Eu acho que a syntax dplyr é

 library(dplyr) df %>% group_by(grp) %>% mutate(z=scale(x)) 

Em geral, essa solução do dplyr é mais rápida do que a divisão de frameworks de dados, mas não tão rapidamente quanto o split-apply-combine.