按列子集数据框并返回这些子集的列表

时间:2018-03-07 00:02:47

标签: r

我想采用像这样的数据框:

df <- data.frame(
  SortCol1 = rep(c("One", "Two", "Three", "Four"), times = 5),
  SortCol2 = rep(c("A", "B"), times = 10),
  Arb1 = rep(c(1,0,1,1,0), times = 4),
  Arb2 = rep(c(0,1,1,0,0), times = 4)
)

   SortCol1 SortCol2 Arb1 Arb2
1       One        A    1    0
2       Two        B    0    1
3     Three        A    1    1
4      Four        B    1    0
5       One        A    0    0
6       Two        B    1    0
7     Three        A    0    1
8      Four        B    1    1
9       One        A    1    0
10      Two        B    0    0
11    Three        A    1    0
12     Four        B    0    1
13      One        A    1    1
14      Two        B    1    0
15    Three        A    0    0
16     Four        B    1    0
17      One        A    0    1
18      Two        B    1    1
19    Three        A    1    0
20     Four        B    0    0

然后按SortCol1SortCol2对其进行子集化,以返回所有子集化数据框的列表。

当我想将一个函数应用于ddplyArb1列时,我在使用Arb2之前已做了很多次类似的事情。

e.g。我知道

ddply(df, c("SortCol1", "SortCol2"), numcolwise(sum))

将根据我想要的两列来设置子集,并返回一个包含这些列和sum函数的最小帧。

我想要的不是将函数应用于这些列,而是将每个子集作为列表元素返回。

假装执行此操作的函数称为ddply_list。我希望有类似于

的东西
ddply_list(df, c("SortCol1", "SortCol2"))

哪个会返回一个列表,其元素将是数据框(我现在手动创建):

df[df$SortCol1=="One" & df$SortCol2 == "A",]
   SortCol1 SortCol2 Arb1 Arb2
1       One        A    1    0
5       One        A    0    0
9       One        A    1    0
13      One        A    1    1
17      One        A    0    1

df[df$SortCol1=="Two" & df$SortCol2 == "B",]
   SortCol1 SortCol2 Arb1 Arb2
2       Two        B    0    1
6       Two        B    1    0
10      Two        B    0    0
14      Two        B    1    0
18      Two        B    1    1

等适用于SortCol1SortCol2的所有组合。

如果有一个功能列表已经完美了!如果没有,任何关于如何实现这个解决方案的建议都会很棒!

我不确定的主要位是将数据帧的所有子集(由列子集化)作为数据帧列表返回的最简单方法。

换句话说,ddply文档将.fun参数描述为... 函数以应用于每个部分。我认为我想要的是一种回归每一件事的方式。作为列表的元素(最好是用于子集的列仍然附加)。

1 个答案:

答案 0 :(得分:3)

事实证明这很简单:

split(df, df[c("SortCol1", "SortCol2"], drop=TRUE)

从这里偷来的答案: Automatically subset data frame by factor

用法:

split(x, f, drop = FALSE, ...)

其中x是向量或数据框,y是用于定义组的因子或因子列表。