2014-02-19 4 views
1

Предположим, что у меня есть этот кадр R данные:Создание вектора кадров данных подмножеств, основанных на группе столбцов

   ts year month day 
1 1295234818000 2011  1 17 
2 1295234834000 2011  1 17 
3 1295248650000 2011  1 17 
4 1295775095000 2011  1 23 
5 1296014022000 2011  1 26 
6 1296098704000 2011  1 27 
7 1296528979000 2011  2 1 
8 1296528987000 2011  2 1 
9 1297037448000 2011  2 7 
10 1297037463000 2011  2 7 

dput(a) 
structure(list(ts = c(1295234818000, 1295234834000, 1295248650000, 
1295775095000, 1296014022000, 1296098704000, 1296528979000, 1296528987000, 
1297037448000, 1297037463000), year = c(2011, 2011, 2011, 2011, 
2011, 2011, 2011, 2011, 2011, 2011), month = c(1, 1, 1, 1, 1, 
1, 2, 2, 2, 2), day = c(17, 17, 17, 23, 26, 27, 1, 1, 7, 7)), .Names = c("ts", 
"year", "month", "day"), row.names = c(NA, 10L), class = "data.frame") 

Есть ли способ, чтобы создать вектор кадров данных, где каждый из них является подмножеством оригинал с уникальными комбинациями из года, месяца и дня? В идеале, я хотел бы получить обратно кадры данных DF1, df2, DF3, df4, DF5 и DF6, в том порядке, в котором:

DF1:

   ts year month day 
1 1295234818000 2011  1 17 
2 1295234834000 2011  1 17 
3 1295248650000 2011  1 17 

DF2:

4 1295775095000 2011  1 23 

DF3:

5 1296014022000 2011  1 26 

DF4:

6 1296098704000 2011  1 27 

DF5:

7 1296528979000 2011  2 1 
8 1296528987000 2011  2 1 

DF6:

9 1297037448000 2011  2 7 
10 1297037463000 2011  2 7 

Любая помощь будет оценена.

+0

Используйте функцию разделения на день. Взгляните на этот пост: http://stackoverflow.com/a/16038343/3248346 –

+1

Кроме того, «взаимодействие» может быть полезно, если я правильно понимаю, что вы хотите. Что-то вроде 'split (a, взаимодействие ($ year, $ month, a $ day, drop = T)). –

+2

@alexis_laz - 'drop = TRUE' также может передаваться как аргумент непосредственно в' split', поэтому это также будет работать: 'with (a, split (a, list (year, month, day), drop = TRUE)) ' – thelatemail

ответ

1
df <- df[order(df$year, df$month, df$day), ] 
df.list <- split(df, list(df$year, df$month, df$day), drop=TRUE) 
listnames <- setNames(paste0("DF", 1:length(df.list)), sort(names(df.list))) 
names(df.list) <- listnames[names(df.list)] 
list2env(df.list, envir=globalenv()) 

# > DF1 
#    ts year month day 
# 1 1.295235e+12 2011  1 17 
# 2 1.295235e+12 2011  1 17 
# 3 1.295249e+12 2011  1 17 
# > DF6 
#    ts year month day 
# 9 1.297037e+12 2011  2 7 
# 10 1.297037e+12 2011  2 7 

Edit:

Как @thelatemail предполагает, то же самое может быть archieved проще сортировки правильно split:

df.list <- with(df, split(df, list(day,month,year), drop=TRUE)) 
df.list <- setNames(df.list, paste0("DF",seq_along(df.list))) 
list2env(df.list, envir=globalenv()) 
+0

Не нужно сортировать, просто измените порядок в' split' - 'df.list <- с (a, split (a, list (день, месяц, год), drop = TRUE)), затем назовите их в последовательности - 'setNames (df.list, paste0 (« DF », seq_along (df.list)))' – thelatemail

+0

@thelatemail Хорошая идея, спасибо. Я делаю редактирование. – lukeA

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