2012-06-20 6 views
1

Я новичок в R, я пытаюсь ввести столбец группы на основе данных в столбце.Создать столбцы группы на основе данных столбца

Пример data.frame

1   11.3178501   4 9  11.618880 
2   10.3969713   20 8  11.047486 
8   9.5067421   14 7  10.079806 
6   6.6135932   6 6   7.002669 
4   5.4157174   2 5   5.566232 
17   3.8860793   5 4   4.235564 
16   3.8183699   15 3   4.406416 
11   1.2574765   18 2   1.885113 
15   0.7084411   7 1   1.130990 

Первый столбец индекса представлен R, но я отсортирован так что порядок отличается, что я пытаюсь сделать, это ввести столбец, который определяет, что кронштейн каждая строка принадлежит основанию на последнем значении столбца. так, если последнее значение столбца между 0-5 => 1, 5-0 => 2 и т.д., то мы добавим новый столбец в конце group -> 1,2,3...

16   3.8183699   15 3   4.406416 1 
11   1.2574765   18 2   1.885113 2 
15   0.7084411   7 1   1.130990 2 

Я попытался следующие dataFrame$column4 < 5, но это дало мне логическое значение, так что я думал, что я буду умножить на 1, то я получил следующее

0 0 0 0 0 1 1 1 1 

Я не уверен, что я на правильном пути.

+1

Взгляните на '? Cut'. Он доставит вам все, что вам нужно. – Justin

+1

есть возможность обойтись без использования разреза, потому что я хочу изучить R без использования причудливых функций. –

+1

Некоторые другие возможности могут быть 'findInterval' или с использованием модульной арифметики, но это поможет, если вы дадите полную спецификацию своих бункеров. – joran

ответ

5

Даже с учетом вашего комментария я все же предлагаю cut. Он находится в базе R и обычно не считается причудливой функцией.

df <- structure(list(V1 = c(1L, 2L, 8L, 6L, 4L, 17L, 16L, 11L, 15L), 
    V2 = c(11.3178501, 10.3969713, 9.5067421, 6.6135932, 5.4157174, 
    3.8860793, 3.8183699, 1.2574765, 0.7084411), V3 = c(4L, 20L, 
    14L, 6L, 2L, 5L, 15L, 18L, 7L), V4 = c(9L, 8L, 7L, 6L, 5L, 
    4L, 3L, 2L, 1L), V5 = c(11.61888, 11.047486, 10.079806, 7.002669, 
    5.566232, 4.235564, 4.406416, 1.885113, 1.13099)), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
-9L)) 

df$groups <- cut(df$V5, seq(0,15, by=5)) 

> df 
    V1   V2 V3 V4  V5 groups 
1 1 11.3178501 4 9 11.618880 (10,15] 
2 2 10.3969713 20 8 11.047486 (10,15] 
3 8 9.5067421 14 7 10.079806 (10,15] 
4 6 6.6135932 6 6 7.002669 (5,10] 
5 4 5.4157174 2 5 5.566232 (5,10] 
6 17 3.8860793 5 4 4.235564 (0,5] 
7 16 3.8183699 15 3 4.406416 (0,5] 
8 11 1.2574765 18 2 1.885113 (0,5] 
9 15 0.7084411 7 1 1.130990 (0,5] 
> 

Наконец, если целые числа, что вы хотите, вы можете принудить groups к целым числам, используя factor.

df$groups <- as.integer(df$groups) 

> as.integer(df$groups) 
[1] 3 3 3 2 2 1 1 1 1 
+1

Примечание. Вы можете указать метки, используемые в самом вызове 'cut'. Факторы являются факторами (внутренне). Все остальное - это всего лишь ярлык, поэтому его можно позаботиться в вызове 'cut'. (Лично я обычно создаю вектор метки для этой цели.) Любые манипуляции с этим целым могут либо (1) обрабатываться «на лету», либо создавать функцию, которая вызывает cut и преобразует их в соответствующие метки, поэтому эта функция вызывается вместо «cut». Модулируйте свои подпрограммы, а не выполняйте несколько шагов. Так я все равно вижу. –

1

Ответ Джастина замечательный; но если вы хотите самостоятельно выполнить кусочек, вы можете сделать это таким образом. Во-первых, определить вектор с вашими порогами, как thre<-c(0,5,10,15), затем сделать внешнюю сравнение ваших значений и эти пороги с большей, чем оператор и просуммировать строки такой созданной матрицы, как это:

rowSums(outer(values,thre,'>')) 

И вуаля, все значения в (0,5] в настоящее время 1, (5,10] являются 2 и т.д.
Облаченный в функции, она может выглядеть следующим образом:

ultraDumbCut<-function(v,thre) rowSums(outer(v,thre,'>')) 

Сделано немного умнее, как это :

dumbCut<-function(v,jump=5,thre=seq(0,max(v),by=jump)) rowSums(outer(v,thre,'>')) 

, так что dumbCut(1:7) - 1 1 1 1 1 2 2, dumbCut(1:7,3) - 1 1 1 2 2 2 3 и dumbCut(1:7,thre=c(0,2,3,5)) - 1 1 2 3 3 4 4.

Следующий шаг - преобразование вывода в коэффициент (поскольку использование чисел для категорий в R - это просто мазохизм) и генерировать значащие имена уровней, поэтому в основном реплицируются фактические cut.