我想采用像这样的数据框:
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
然后按SortCol1
和SortCol2
对其进行子集化,以返回所有子集化数据框的列表。
当我想将一个函数应用于ddply
和Arb1
列时,我在使用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
等适用于SortCol1
和SortCol2
的所有组合。
如果有一个功能列表已经完美了!如果没有,任何关于如何实现这个解决方案的建议都会很棒!
我不确定的主要位是将数据帧的所有子集(由列子集化)作为数据帧列表返回的最简单方法。
换句话说,ddply
文档将.fun
参数描述为... 函数以应用于每个部分。我认为我想要的是一种回归每一件事的方式。作为列表的元素(最好是用于子集的列仍然附加)。
答案 0 :(得分:3)
事实证明这很简单:
split(df, df[c("SortCol1", "SortCol2"], drop=TRUE)
从这里偷来的答案: Automatically subset data frame by factor
用法:
split(x, f, drop = FALSE, ...)
其中x
是向量或数据框,y
是用于定义组的因子或因子列表。