R用箱子替换值

时间:2011-11-17 23:33:23

标签: r classification

我有一个带整数值的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]

2 个答案:

答案 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]