2016-06-21 3 views
0

У меня есть Dataframe с большим количеством строк, я хотел бы добавить столбец, который отсчитывает по каждой ой строке и пометить его соответствующим образом, например:R Последовательность чисел в dataframe

ROW LABEL 
1  1 
2  1 
3  1 
4  1 
5  2 
6  2 
7  2 
8  2 
9  3 
9  3 

И так далее , где ROW - это строка моего Dataframe. Я хотел бы иметь возможность изменять счет LABEL, в примере, который я показал, количество меток установлено равным 4 (каждая четвертая строка увеличивает метку). Любая помощь приветствуется.

П.

+0

У вас есть строка 9 дважды ... – Frank

ответ

0

Вы можете использовать rep вместе с каждым аргументом:

rep(1:4, each=4) 
[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 

Затем, чтобы назначить его:

df$label <- rep(1:4, each=4) 

Чтобы это сделать более динамичным, вы можете кормить аргумент x - мера общих рядов:

df$label <- rep(1:ceiling(nrow(df)/4), each=4) 

Это предполагает, что общее число строк, делится на 4. Если это не так, вы можете также включать length.out аргумент (как это было предложено @Frank), чтобы установить правильное различие длины:

df$label <- rep(1:ceiling(nrow(df)/4), each=4, length.out=nrow(df)) 

Можно также переписать вектор разной длины, чтобы повторить каждый элемент в x, если вы хотите изменить длину каждой метки. Например:

rep(1:4, c(1, 2, 3, 4)) 
[1] 1 2 2 3 3 3 4 4 4 4 

Обратите внимание, что длина вектора должна иметь такую ​​же длину, как вектор x.

+0

Мне нужно, чтобы это выполнялось по разному количеству строк заданного Dataframe .... здесь я получаю сообщение об ошибке, потому что мой dataframe имеет длину 20000+ строк, а код генерирует 20 строк ... Я уверен, что это небольшой настройки. – PaulBeales

+0

@PaulB 'rep (seq (nrow (DF))/4, each = 4)'? – Frank

+0

Извините, это также вызывает ошибку, поскольку она генерирует в 4 раза больше строк, чем у моего datafrane. Спасибо за это, хотя я думаю, что могу понять это – PaulBeales

0

Вы можете использовать следующий код. Вы можете изменить количество меток и повторений в первых двух строках.

labelQuantity <- 4 
repeatLabel <- 4 
label <- rep(1:labelQuantity,1,each=repeatLabel) 
row <- seq(1,length(label),1) 
myDataFrame <- as.data.frame(cbind(row,label)) 

Cheers!

1

Два слова: integer division.

Использование rep():

N <- 4L; df$LABEL <- rep(seq_len(nrow(df)%/%N+1L),each=N,len=nrow(df)); 
df; 
## ROW LABEL 
## 1 1  1 
## 2 2  1 
## 3 3  1 
## 4 4  1 
## 5 5  2 
## 6 6  2 
## 7 7  2 
## 8 8  2 
## 9 9  3 

Использование seq():

N <- 4L; df$LABEL <- seq(0L,len=nrow(df))%/%N+1L; 
df; 
## ROW LABEL 
## 1 1  1 
## 2 2  1 
## 3 3  1 
## 4 4  1 
## 5 5  2 
## 6 6  2 
## 7 7  2 
## 8 8  2 
## 9 9  3 

данных

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