R заменить значения с бинами - PullRequest
1 голос
/ 18 ноября 2011

У меня есть 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 ]

10 голосов
/ 18 ноября 2011

Является ли 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 голос
/ 31 мая 2018

В дополнение к Хонгу, который предлагает хорошее решение, я нашел кое-что весьма полезное в 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...