使用列值在新数据帧中的子集数据帧

时间:2015-03-13 18:46:46

标签: r dplyr reshape

我正在尝试自动在不同的data.frames中对大数据框进行子集化。我有类似的东西:

Type1 Type2 Type3 Info1 Info2 Info3
A     1     Z     a     a     a    
A     2     Y     b     b     b
B     4     X     c     c     c
A     1     Z     d     d     d

我想为每个Type3> Type2> Type1

创建不同的数据框

第一个数据框(A1Z):

Type1 Type2 Type3 Info1 Info2 Info3
A     1     Z     a     a     a    
A     1     Z     d     d     d

第二个数据框(A2Y):

Type1 Type2 Type3 Info1 Info2 Info3
A     2     Y     b     b     b    

...

达到这个目标的最快方法是什么?谢谢!!

1 个答案:

答案 0 :(得分:4)

您可以使用split生成data.frames列表:

> split(df, do.call(paste0, df[,1:3]))
$A1Z
  Type1 Type2 Type3 Info1 Info2 Info3
1     A     1     Z     a     a     a
4     A     1     Z     d     d     d

$A2Y
  Type1 Type2 Type3 Info1 Info2 Info3
2     A     2     Y     b     b     b

$B4X
  Type1 Type2 Type3 Info1 Info2 Info3
3     B     4     X     c     c     c

通常建议将相关数据结构(如data.frames)保存在单个对象中(在本例中为列表)。如果要将这些data.frames分配给全局环境,可以调查?list2env


正如弗兰克在评论中指出的那样,这样的分裂可能没有必要(尽管如果没有更多信息我们就不能肯定地说)。使用dplyr,您可以使用group_by按这些TypeX列对数据进行分组,然后对每个组执行一些操作。你可以这样开始:

library(dplyr)
df %>% 
  group_by(Type1, Type2, Type3) %>% 
#   ... more manipulations...

#Source: local data frame [4 x 6]
#Groups: Type1, Type2, Type3
#
#  Type1 Type2 Type3 Info1 Info2 Info3
#1     A     1     Z     a     a     a
#2     A     2     Y     b     b     b
#3     B     4     X     c     c     c
#4     A     1     Z     d     d     d