2013-09-06 2 views
1

Я создал вектор признаков (data.frame), который имеет идентификатор, feat1, feat2, feat3, логический, но в этом кадре данных имеются дубликаты идентификаторов, что делается целенаправленно. То, что я хочу сделать, - это то, что я перебираю этот кадр данных, создавая новый фрейм данных для каждого идентификатора.R Создать новый фрейм данных для каждого уникального идентификатора

Для простоты предположим, я следующие два столбца.

  X1   X2  X3 
1 000000001 -1.4061361  1 
2 000000001 -0.1973846  1 
3 000000002 -0.4385071  1 
4 000000001 -0.6593677  0 
5 000000001 -1.2592415  0 
6 000000001 -0.5463655  1 
7 000000002 0.4231117  0 
8 000000002 -0.1640883  1 
9 000000002 0.7157506  0 
10 000000002 2.3234110  1 

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

+3

Использование 'split' с X1 –

+2

Обратите внимание, что при создании всех этих копий будет, по крайней мере, вдвое больше использования вашей памяти. Поэтому, если вы планируете провести анализ на каждом фрагменте и сохранить только небольшой набор итоговых результатов, проверьте функцию 'by()'. –

+0

@ Ferdinand.kraft Да, я планирую сделать анализ инфантной причины. Я делаю это. Я хочу запускать randomforest на каждом, поэтому я действительно беспокоился о потреблении памяти. Как вы предлагаете мне использовать это дело? –

ответ

1

Это использует один цикл - лучше?

ids <- unique(df$X1) 

for(i in 1:length(ids)){ 
    id <- ids[i] 
    mini.df <- data.frame(df[df$X1 == id, ]) 
    assign(paste("mini.df", i, sep="."), mini.df) 
    # or alternatively, if you wanted the data.frames to be assigned by id, 
    # assign(id, mini.df) 
} 
3

Как указано в комментариях, используйте split. Если вы действительно хотите, чтобы новые объекты, созданные, использовать split в сочетании с list2env следующим образом:

## What is in the workspace presently? 
ls() 
# [1] "mydf" 

## This is where most R users would probably stop 
split(mydf, mydf$X1) 
# $`1` 
# X1   X2 X3 
# 1 1 -1.4061361 1 
# 2 1 -0.1973846 1 
# 4 1 -0.6593677 0 
# 5 1 -1.2592415 0 
# 6 1 -0.5463655 1 
# 
# $`2` 
# X1   X2 X3 
# 3 2 -0.4385071 1 
# 7 2 0.4231117 0 
# 8 2 -0.1640883 1 
# 9 2 0.7157506 0 
# 10 2 2.3234110 1 

Приведенная выше команда создает list, который является очень удобный формат, чтобы иметь, если вы собираетесь делать подобные расчеты на каждый элемент списка. Большинство пользователей R остановились бы там. Если вам действительно нужны отдельные объекты в рабочей области, используйте list2env:

list2env(split(mydf, mydf$X1), envir=.GlobalEnv) 
# <environment: R_GlobalEnv> 

## How many objects do we have now? 
ls() 
# [1] "1" "2" "mydf" 

Обратите внимание, что эти имена не являются синтаксически правильным, поэтому вам нужно использовать кавычку (</code>) to access them. (Or, alternatively, Get («1») `).

`1` 
# X1   X2 X3 
# 1 1 -1.4061361 1 
# 2 1 -0.1973846 1 
# 4 1 -0.6593677 0 
# 5 1 -1.2592415 0 
# 6 1 -0.5463655 1 
`2` 
# X1   X2 X3 
# 3 2 -0.4385071 1 
# 7 2 0.4231117 0 
# 8 2 -0.1640883 1 
# 9 2 0.7157506 0 
# 10 2 2.3234110 1 
Смежные вопросы