2010-07-21 1 views
59

Я хочу разбить фрейм данных на несколько меньших. Это выглядит очень тривиальным вопросом, однако я не могу найти решение из веб-поиска.Как разбить фрейм данных?

+1

никогда не понимал 'split()', но используя ['ntile' из' dplyr'] (http://stackoverflow.com/a/27646599/1888983), а затем фильтрацию по индексу группы («квартиль») что я хотел: 'group = df [df $ quartile == i,]'. – jozxyqk

ответ

18

Если вы хотите разделить фрейм данных в соответствии со значениями некоторой переменной, я бы предложил использовать daply() из пакета plyr.

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

Теперь x является массивом dataframes. Чтобы получить доступ к одному из данных, вы можете проиндексировать его с именем уровня разделительной переменной.

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

я быть уверен, что нет других, более умные способы борьбы с вашими данными, прежде чем разделив его на множество dataframes хотя.

+0

, пожалуйста, предоставьте пакет, из которого не имеет базовую функцию, - предположительно вы имеете в виду daply из пакета plyr? – mdsumner

+0

Я загрузил plyr в своем фрагменте кода, поэтому я подумал, что это ясно, но я буду редактировать прозу для прояснения. – JoFrhwld

+1

Не хотите сказать 'dlply'? – hadley

51

Вы также можете вырезать кадр данных на произвольное число меньших dataframes. Здесь мы разрезаем два кадра данных.

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 
+0

Greg, Ваше решение работает! спасибо. – Leo5188

+0

Нет проблем. Я рад, что это так. – Greg

+1

Привет, greg, я не мог понять синтаксис команды sample, можете ли вы это объяснить. – Anirudh

3

Ответ вы хотите очень сильно зависит от того, как и почему вы хотите, чтобы разбить кадр данных.

Например, если вы хотите оставить некоторые переменные, вы можете создавать новые кадры данных из определенных столбцов базы данных. Нижние индексы в скобках после кадра данных относятся к номерам строк и столбцов. Зайдите в Spoetry для полного описания.

newdf <- mydf[,1:3] 

Или вы можете выбрать определенные строки.

newdf <- mydf[1:3,] 

И эти индексы также могут быть логические тесты, такие как выбор строки, которые содержат определенное значение, или факторов, с требуемым значением.

Что вы хотите сделать с оставшимися кусками? Вам нужно выполнить одну и ту же операцию на каждом фрагменте базы данных? Затем вы захотите убедиться, что подмножества кадра данных окажутся в удобном объекте, таком как список, который поможет вам выполнить одну и ту же команду на каждом фрагменте фрейма данных.

12

Я только что отправил своего рода RFC, которые могут помочь вам: Split a vector into chunks in 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 

Приветствия, Sebastian

10

Вы можете также использовать

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

Это сделает dataframe с значения, где sum_points = 2500

Это дает:

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 
+0

привет, как бы вы пошли, если бы хотели разбить его динамически на другой data_frame, основанный на уникальных значениях в этом столбце.? –

3

Если вы хотите разделить на значения в одном из столбцов, вы можете использовать lapply. Например, чтобы разделить ChickWeight в отдельный набор данных для каждого цыпленка:

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

Расщепление кадр данных кажется непродуктивным. Вместо этого используйте сплит-применение, объединить парадигму, например, генерировать некоторые данные

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

затем расколоть только соответствующие столбцы и применить функцию scale() х в каждой группе, и объединить результаты (с использованием split<- или 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) 

Это будет очень быстро по сравнению с расщеплением data.frames, а результат остается использовать по ходу анализа без итерации. Я думаю, что синтаксис dplyr является

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

В целом это dplyr решение быстрее, чем расщепление кадров данных, но не так быстро, как сплит-применить-комбайн.

 Смежные вопросы

  • Нет связанных вопросов^_^