программирование R петли - PullRequest
       11

программирование R петли

0 голосов
/ 03 декабря 2018

Мне нужна помощь в программировании R. У меня есть data.frame B с одним столбцом

x<- c("300","300","300","400","400","400","500","500","500"....etc.)  **2 milion rows** 

, и мне нужно создать следующие столбцы с рангом.Следующие столбцы должны выглядеть следующим образом:

y<- c(1,2,3,1,2,3,1,2,3,......etc. ) 

Я использовал цикл с for для

B$y[1]=1
for (i in 2:length(B$x))
{  
     B$y[i]<-ifelse(B$x[i]==B$x[i-1], B$y[i-1]+1, 1)
}

Процесс длился 4 часа.

Так что мне нужна помощь, чтобы что-то ускорилось или что-то ещееще.
Спасибо за ваш ответ.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вот решение с базой R:

B <- data.frame(x = rep(c(300, 400, 400), sample(c(5:10), 3)))
B
B$y <- ave(B$x, B$x, FUN=seq_along)
0 голосов
/ 03 декабря 2018

Вот подход с dplyr, который занимает около 0,2 секунды для 2 миллионов строк.

Сначала я создаю пример данных:

n = 2E6  # number of rows in test
library(dplyr)
sample_data <- data.frame(
  x = round(runif(n = n, min = 1, max = 100000), digits = 0)
) %>%
  arrange(x)  # Optional, added to make output clearer so that each x is adjacent to the others that match.

Затем я группирую по x и делаю y показать, какое вхождение x находится в этой группе.

sample_data_with_rank <- sample_data %>%
  group_by(x) %>%
  mutate(y = row_number()) %>%
  ungroup()

head(sample_data_with_rank, 20)

# A tibble: 20 x 2
       x     y
   <dbl> <int>
 1     1     1
 2     1     2
 3     1     3
 4     1     4
 5     1     5
 6     1     6
 7     1     7
 8     1     8
 9     1     9
10     1    10
11     1    11
12     1    12
13     1    13
14     1    14
15     1    15
16     2     1
17     2     2
18     2     3
19     2     4
20     2     5
...