【发布时间】: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 编号 10 5 2 12 10 2但我希望 id=2 的那个比 id =1 的那个更早 所以基本上我希望输出是
x y 编号 10 5 2 12 10 2和
x y 编号 15 0 1【问题讨论】:
我有一个这样的数据框 df
df x y 编号 10 5 2 12 10 2 15 0 1我想按 id 拆分。我用了split(df, df$id),我得到了
和
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【问题讨论】:
根据split() 的文档,列表的组件由f 的级别命名(转换为因子后...)。 f 是 split() 的第二个参数。因此,分块后按因子水平的顺序出现。
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(),因为id 是integer 类型。 编辑这也可以在没有任何包的情况下实现:
split(df, factor(df$id, levels = unique(df$id)))
【讨论】:
只需切换列表中元素的顺序即可。
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)
【讨论】:
split() 的文档在 Value 部分中说:列表的组件由f 的级别命名(转换为一个因素...) f 是split() 的第二个参数。因此,块按照因子水平的顺序出现。