我有一个带整数值的df。出于分类的目的,我想将这个df替换为具有预定间隔而不是整数的更简单的df。我该如何有效地做到这一点?一个例子如下:
DF:
1 2 3
1 5 3 0
2 1 10 12
3 3 0 10
转换为:
1 2 3
1 [3-5] [3-5] [0-2]
2 [0-2] [10-12][10-12]
3 [3-5] [0-2] [10-12]
答案 0 :(得分:10)
df
是数据框还是矩阵?这个名字暗示了前者,但你描述它的方式暗示了后者。
如果是矩阵:
df2 <- cut(df, c(0, 2, 5, 9 12))
dim(df2) <- dim(df)
如果是数据框:
df[] <- lapply(df, cut, c(0, 2, 5, 9, 12))
答案 1 :(得分:1)
除了提出良好解决方案的Hong之外,我在ggplot2中发现了一些非常有用的东西:
cut_interval
- 制作范围相等的n组
cut_number
- 使n组具有近似相等的观察值
cut_width
- 制作n个相等宽度的组
在我看来,这些功能比基本切割功能更灵活,更容易理解。请注意,函数返回因子而不是矩阵。
您可以使用以下内容:
df <- matrix(c(5,3,0,1,10,12,3,0,10), nrow=3)
m.df <- melt(df)
m.df$value <- cut_width(m.df$value, width=2, boundary=0)
这将返回
Var1 Var2 value
1 1 1 (4,6]
2 2 1 (2,4]
3 3 1 [0,2]
4 1 2 [0,2]
5 2 2 (8,10]
6 3 2 (10,12]
7 1 3 (2,4]
8 2 3 [0,2]
9 3 3 (8,10]
如果需要,可以将其转换回方阵:
df.bins <- acast(m.df, Var1~Var2)
最后给予:
1 2 3
1 (4,6] [0,2] (2,4]
2 (2,4] (8,10] [0,2]
3 [0,2] (10,12] (8,10]
Levels: [0,2] (2,4] (4,6] (6,8] (8,10] (10,12]