R: цикл через каждые 5 строк фрейма данных и вложение инкрементного значения

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

Входные данные:

state Value 
  a    1
  b    2
  a    3
  c    4
  a    5
  e    6
  f    7
  w    8
  f    9
  s    10
  e    11
  r    12
  s    13
  s    14

Желаемый результат:

state Value Increment
  a    1     1
  b    2     1
  a    3     1
  c    4     1
  a    5     1
  e    6     2
  f    7     2
  w    8     2
  f    9     2
  s    10    2
  e    11    3
  r    12    3
  s    13    3
  s    14    3

5 ответов

Решение

Это ваши данные:

df = read.table(text = 
                "state Value 
                     a     1
                     b     2
                     a     3
                     c     4
                     a     5
                     e     6
                     f     7
                     w     8
                     f     9
                     s     10
                     e     11
                     r     12
                     s     13
                     s     14", 
                header=T)

Теперь вы можете использовать rownames чтобы помочь вам вменять дополнительные значения. Строка кода ниже дает вам желаемый результат, взяв индексы строк, разделив их на 5 а затем получить ceiling (т. е. ближайшее большее целое число).

df$Increment <- ceiling(as.numeric(rownames(df))/5)

Что даст вам ожидаемый результат:

#    state Value Increment
# 1      a     1         1
# 2      b     2         1
# 3      a     3         1
# 4      c     4         1
# 5      a     5         1
# 6      e     6         2
# 7      f     7         2
# 8      w     8         2
# 9      f     9         2
# 10     s    10         2
# 11     e    11         3
# 12     r    12         3
# 13     s    13         3
# 14     s    14         3

Надеюсь, поможет.

Вот dplyr решение, которое проверяет, равен ли остаток от деления номера строки минус один на 5 0. Если он равен 0, это увеличивает значение нового столбца на 1.

dt = read.table(text = 
"state Value 
a    1
b    2
a    3
c    4
a    5
e    6
f    7
w    8
f    9
s    10
e    11
r    12
s    13
s    14", header=T)

library(dplyr)

dt %>% mutate(Increment = cumsum((row_number()-1) %% 5 == 0))

#    state Value Increment
# 1      a     1         1
# 2      b     2         1
# 3      a     3         1
# 4      c     4         1
# 5      a     5         1
# 6      e     6         2
# 7      f     7         2
# 8      w     8         2
# 9      f     9         2
# 10     s    10         2
# 11     e    11         3
# 12     r    12         3
# 13     s    13         3
# 14     s    14         3

Пытаться :

dt = read.table(text = 
                  "state Value 
a    1
b    2
a    3
c    4
a    5
e    6
f    7
w    8
f    9
s    10
e    11
r    12
s    13
s    14", header=T)

dt$Increment<- unlist(lapply(1:ceiling(nrow(dt)/5), function(x) rep(x, 5) ))[1:nrow(dt)]
dt

Следующая функция будет делать то, что вы хотите.
Аргументы:

  1. DF - входной data.frame;
  2. N- количество повторений каждого значения в приращении;
  3. newcol - имя столбца приращения, по умолчанию "Increment",

Просто присвойте результат новому df.

fun <- function(DF, N, newcol = "Increment"){
  n <- nrow(DF)
  f <- rep_len(c(1, rep(0, N - 1)), length.out = n)
  DF[[newcol]] <- cumsum(f)
  DF
}

fun(df1, N = 5)

Данные.

set.seed(1234)    # Make the results reproducible
n <- 14
state <- sample(letters, n, TRUE)
Value <- seq_len(n)
df1 <- data.frame(state, Value)

Пытаться:

rep(c(1:((nrow(df)/5)+1)),
    each=5,
    length.out=dim(df)[1])

Который дает:

> df$Increment<-rep(c(1:((nrow(df)/5)+1)),
+     each=5,
+     length.out=dim(df)[1])
> df
   state Value Increment
1      a     1         1
2      b     2         1
3      a     3         1
4      c     4         1
5      a     5         1
6      e     6         2
7      f     7         2
8      w     8         2
9      f     9         2
10     s    10         2
11     e    11         3
12     r    12         3
13     s    13         3
14     s    14         3

куда df является:

dt = read.table(text = 
"state Value 
a    1
b    2
a    3
c    4
a    5
e    6
f    7
w    8
f    9
s    10
e    11
r    12
s    13
s    14", header=T)
Другие вопросы по тегам