Создать счетчик с несколькими переменными

У меня есть данные, которые выглядят следующим образом:

CustomerID TripDate 1 1/3/2013 1 1/4/2013 1 1/9/2013 2 2/1/2013 2 2/4/2013 3 1/2/2013 

Мне нужно создать переменную счетчика, которая будет выглядеть следующим образом:

 CustomerID TripDate TripCounter 1 1/3/2013 1 1 1/4/2013 2 1 1/9/2013 3 2 2/1/2013 1 2 2/4/2013 2 3 1/2/2013 1 

Tripcounter будет для каждого клиента.

Используйте ave . Предполагая, что ваш data.frame называется «mydf»:

 mydf$counter <- with(mydf, ave(CustomerID, CustomerID, FUN = seq_along)) mydf # CustomerID TripDate counter # 1 1 1/3/2013 1 # 2 1 1/4/2013 2 # 3 1 1/9/2013 3 # 4 2 2/1/2013 1 # 5 2 2/4/2013 2 # 6 3 1/2/2013 1 

Для чего это стоит, я также реализовал версию этого подхода в функции, включенной в мой пакет «splitstackshape». Функция называется getanID :

 mydf <- data.frame(IDA = c("a", "a", "a", "b", "b", "b", "b"), IDB = c(1, 2, 1, 1, 2, 2, 2), values = 1:7) mydf # install.packages("splitstackshape") library(splitstackshape) # getanID(mydf, id.vars = c("IDA", "IDB")) getanID(mydf, id.vars = 1:2) # IDA IDB values .id # 1 a 1 1 1 # 2 a 2 2 1 # 3 a 1 3 2 # 4 b 1 4 1 # 5 b 2 5 1 # 6 b 2 6 2 # 7 b 2 7 3 

Как видно из приведенного выше примера, я написал функцию таким образом, что вы можете указать один или несколько столбцов, которые должны обрабатываться как столбцы идентификаторов. Он проверяет, дублируется ли какой-либо из id.vars , и если они есть, то он генерирует новую идентификационную переменную для вас.

Вы также можете использовать plyr для этого (используя данные примера @ AnadaMahto):

 > ddply(mydf, .(IDA), transform, .id = seq_along(IDA)) IDA IDB values .id 1 a 1 1 1 2 a 2 2 2 3 a 1 3 3 4 b 1 4 1 5 b 2 5 2 6 b 2 6 3 7 b 2 7 4 

или даже:

 > ddply(mydf, .(IDA, IDB), transform, .id = seq_along(IDA)) IDA IDB values .id 1 a 1 1 1 2 a 1 3 2 3 a 2 2 1 4 b 1 4 1 5 b 2 5 1 6 b 2 6 2 7 b 2 7 3 

Обратите внимание, что plyr не имеет репутации самого быстрого решения, поскольку вам нужно взглянуть на data.table .


Вот подход, data.table на data.table :

 library(data.table) DT <- data.table(mydf) DT[, .id := sequence(.N), by = "IDA,IDB"] DT # IDA IDB values .id # 1: a 1 1 1 # 2: a 2 2 1 # 3: a 1 3 2 # 4: b 1 4 1 # 5: b 2 5 1 # 6: b 2 6 2 # 7: b 2 7 3 

Между тем, вы также можете использовать dplyr . если ваш data.frame называется mydata

 library(dplyr) mydata %>% group_by(CustomerID) %>% mutate(TripCounter = row_number()) 

Мне нужно делать это часто и писать функцию, которая выполняет ее иначе, чем предыдущие ответы. Я не уверен, какое решение наиболее эффективно.

 idCounter <- function(x) { unlist(lapply(rle(x)$lengths, seq_len)) } mydf$TripCounter <- idCounter(mydf$CustomerID) 

Вот код, оформленный в стиле процедуры. Я не верю в такие вещи, как если вы используете цикл в R, то вы, вероятно, делаете что-то неправильно

 x <- dataframe$CustomerID dataframe$counter <- 0 y <- dataframe$counter count <- 1 for (i in 1:length(x)) { ifelse (x[i] == x[i-1], count <- count + 1, count <- 1 ) y[i] <- count } dataframe$counter <- y 

Это неправильный ответ, но показывающий некоторые интересные вещи по сравнению с циклами, векторизация быстро не заботится о последовательном обновлении. a <-read.table (textConnection («CustomerID TripDate 1 1/3/2013 1 1/4/2013 1 1/9/2013 2 02/1/2013 2 4/4/2013 3 1/2/2013») , header = TRUE)

 a <- a %>% group_by(CustomerID,TripDate) # must in order res <- rep(1, nrow(a)) #base @ 1 res[2:6] <-sapply(2:6, function(i)if(a$CustomerID[i]== a$CustomerID[i - 1]) {res[i] = res[i-1]+1} else {res[i]= res[i]}) a$TripeCounter <- res 
  • Увеличить расстояние между текстом и заголовком по оси y
  • Как назвать переменные «на лету»?
  • Как изменить местоположение библиотеки в R?
  • Ошибка DocumentTermMatrix в аргументе Corpus
  • Удалите строки со всеми или некоторыми НС (отсутствующие значения) в data.frame
  • игнорировать NA в строке dplyr row
  • Как выполнить естественную сортировку?
  • Комбинированный график ggplot2 (Не в одном графике), используя функцию par () или layout ()?
  • Анализ Квай-квадратов с использованием для цикла в R
  • Преобразование кадра данных с столбцом даты в таймсерии
  • Извлечь значения столбца матрицы по имени столбца матрицы
  • Давайте будем гением компьютера.