【发布时间】:2018-03-07 00:02:46
【问题描述】:
我想要一个这样的数据框:
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 对其进行子集化,以返回所有子集化数据帧的列表。
当我想将函数应用于Arb1 和Arb2 列时,在使用ddply 之前,我已经多次做过类似的事情。
例如我知道
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 参数描述为... 应用于每个部分的函数。我认为我想要的是一种将每个“片段”作为列表元素返回的方法(最好仍然附加用于子集的列)。
【问题讨论】:
标签: r