【问题标题】:Subsetting a data frame by columns and returning a list of those subsets按列对数据框进行子集化并返回这些子集的列表
【发布时间】: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


    【解决方案1】:

    原来很简单:

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

    从这里窃取的答案: Automatically subset data frame by factor

    用法:

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

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

    【讨论】:

    • 沿着正确的路线,但我想你想要split(df, df[1:2], drop=TRUE)
    • 谢谢!这似乎很接近,但我希望能够根据 SortCol1 和 SortCol2 的独特组合进行子集化。有什么想法吗?
    • @thelatemail,我在看到您的评论之前添加了该评论。你的正是我想要的,谢谢!如果您想将其发布为解决方案,我会很乐意将其标记为答案:)
    • 我确实稍微改变了它,所以我可以命名列,即df[c("SortCol1", "SortCol2"]
    • 我刚刚稍微编辑了 Amar 的答案以说明这一变化。您需要的一切现在都应该在那里。
    猜你喜欢
    • 2013-08-15
    • 2013-04-22
    • 2019-07-14
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多