我有一个具有整数值的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]
发布于 2011-11-18 08:18:43
df
是数据框架还是矩阵?名字让人联想到前者,但你描述它的方式却让人联想到后者。
如果它是一个矩阵:
df2 <- cut(df, c(0, 2, 5, 9 12))
dim(df2) <- dim(df)
如果它是一个数据框:
df[] <- lapply(df, cut, c(0, 2, 5, 9, 12))
发布于 2018-05-31 06:42:01
除了洪,他提出了一个很好的解决方案,我在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]
https://stackoverflow.com/questions/8175887
复制相似问题