【问题标题】:How to split a data frame in the order I want?如何按我想要的顺序拆分数据框?
【发布时间】:2017-04-14 23:47:47
【问题描述】:

我有一个这样的数据框 df

df x y 编号 10 5 2 12 10 2 15 0 1

我想按 id 拆分。我用了split(df, df$id),我得到了

x y 编号 15 0 1

x y 编号 10 5 2 12 10 2

但我希望 id=2 的那个比 id =1 的那个更早 所以基本上我希望输出是

x y 编号 10 5 2 12 10 2

x y 编号 15 0 1

【问题讨论】:

    标签: r dataframe split


    【解决方案1】:

    根据split() 的文档,列表的组件由f 的级别命名(转换为因子后...)fsplit() 的第二个参数。因此,分块后按因子水平的顺序出现。

    OP has requested 表示块的返回顺序应与它们在df 中出现的顺序相同。这可以通过 Hadley 的 forcats 包的 fct_inorder() 函数方便地实现:

    split(df, forcats::fct_inorder(factor(df$id)))
    #$`2`
    #   x  y id
    #1 10  5  2
    #2 12 10  2
    #
    #$`1`
    #   x y id
    #3 15 0  1
    

    注意,那个

    • id 本身保持不变。 fct_inorder() 仅用于定义拆分。
    • 只需要额外调用factor(),因为idinteger 类型。

    编辑这也可以在没有任何包的情况下实现:

    split(df, factor(df$id, levels = unique(df$id)))
    

    【讨论】:

    • 有没有其他方法可以在不使用任何包的情况下实现这一目标?
    • @Taliman 这是可能的,但不那么容易记住。查看我的编辑。
    • 这很棒。谢谢。
    【解决方案2】:

    只需切换列表中元素的顺序即可。

    Sdf = split(df, df$id)
    Sdf = Sdf[c(2,1)]
    
    $`2`
       x  y id
    1 10  5  2
    2 12 10  2
    
    $`1`
       x y id
    3 15 0  1
    

    你也可以使用rev(反向)

    Sdf = rev(Sdf)
    

    【讨论】:

    • 谢谢。但是对于我的问题,我不能使用反向,因为数据帧是在循环中生成的,并且有时我希望数据从 id =1 到 id =2。
    • 我不能使用反向来解决我的问题,因为我有时希望 id 遵循从 id=1 到 id=2 的顺序
    • 好的。但是如果你可以指定顺序,你可以使用第一种方法。
    • 我想知道为什么即使数据首先具有 id=2,split 函数也会将数据从 id =1 拆分为 id =2?你知道原因吗?
    • @Taliman split() 的文档在 Value 部分中说:列表的组件由f 的级别命名(转换为一个因素...) fsplit() 的第二个参数。因此,块按照因子水平的顺序出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    相关资源
    最近更新 更多