2015-08-29 2 views
0

Вот кадр пример данных:Как создать неровную последовательность чисел в R

df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2)) 

Я хочу создать последовательность чисел в соответствии с числом наблюдений y на x группы (например, есть 2 наблюдения за y за x=1). Я хочу, чтобы последовательность непрерывно увеличивалась и прыгала на 2 после каждой группы x.

Нужный выход для этого примера будет:

1,2,5,6,7,10,11,14,17,20,21,22,25,26 

Как я могу сделать это просто в R?

+1

Если они сгруппированы уже, и маркированы так, как вы показали, не могли бы вы просто запустить его как 'ф.р. $ rowname <- 1 : dim (df) [1]; df $ newNumber <- df $ rowname + (df $ x-1) * 2', а 'df $ newNumber' - желаемый результат? – chappers

+0

@chappers благодарит за идею, однако я ищу общее решение, я просто понял, что мой x является последовательным, что может быть разрешено этим, но x действительно может быть любым значением – xyy

+0

Расширение идеи @chappers, 'library (Таблица данных); setDT (df) [, gr: = .GRP, x] [, 1: .N + (gr-1) * 2] # [1] 1 2 5 6 7 10 11 14 17 20 21 22 25 26' – akrun

ответ

2

Чтобы расширить мой комментарий, группировки могут быть произвольными, вам просто нужно переделать его в правильное упорядочение. Есть несколько способов сделать это, @akrun показал, что это можно сделать с помощью функции match, или вы можете использовать функцию as.numeric, если это проще понять для себя.

df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2)) 

# these are equivalent 
df$newx <- as.numeric(factor(df$x, levels=unique(df$x))) 
df$newx <- match(df$x, unique(df$x)) 

Поскольку теперь у вас есть «новый» releveling который является последовательным, мы можем использовать логику, которая обсуждалась в комментариях.

df$newNumber <- 1:nrow(df) + (df$newx-1)*2 

Для этого примера, это приведет к следующему dataframe:

x y newx newNumber 
1 1 1   1 
1 2 1   2 
2 3 2   5 
2 4 2   6 
2 6 2   7 
3 3 3  10 
3 7 3  11 
4 8 4  14 
5 6 5  17 
6 4 6  20 
6 3 6  21 
6 7 6  22 
9 3 7  25 
9 2 7  26 

где df$newNumber является вывод, который вы хотели.


Чтобы создать последовательность 0,0,4,4,4,9,..., в основном то, что вы делаете, принимая минимум каждой группы и вычитания 1. Самый простой способ сделать это - использовать library(dplyr).

library(dplyr) 
df %>% 
    group_by(x) %>% 
    mutate(newNumber2 = min(newNumber) -1) 

Какой будет иметь выход:

Source: local data frame [14 x 5] 
Groups: x 

    x y newx newNumber newNumber2 
1 1 1 1   1   0 
2 1 2 1   2   0 
3 2 3 2   5   4 
4 2 4 2   6   4 
5 2 6 2   7   4 
6 3 3 3  10   9 
7 3 7 3  11   9 
8 4 8 4  14   13 
9 5 6 5  17   16 
10 6 4 6  20   19 
11 6 3 6  21   19 
12 6 7 6  22   19 
13 9 3 7  25   24 
14 9 2 7  26   24 
+0

спасибо, chappers! Мне интересно, есть ли у вас другой гениальный способ получить последовательность «0,0,4,4,4,9,9,13,16,19,19,19,24,24' из тех же данных как указано выше? – xyy

+0

См. Мое редактирование. Возможно, это можно сделать в Base R, но dplyr был моей первоначальной мыслью. – chappers

Смежные вопросы