Может ли кто-нибудь предложить более быстрый способ перебора или циклического перебора этого фрейма данных? - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть фрейм данных с примерно 500 000 строк и четырьмя столбцами. Фрейм данных содержит данные о посещениях определенного места конкретным пользователем. Пример кадра данных приведен ниже:

> head(data)
  FirstVisit VisitDate                   ID  visit.count
1    40545     40545                 000001        1
2    40545     40545                 000002        1
3    40548     40548                 000003        1
4    40545     40565                 000001        2
5    40545     40575                 000002        2
6    40545     40576                 000002        3

Каждое наблюдение содержит первую дату пользователя (в целочисленном формате, где 1 - 01.01.1900), дату его посещения, его уникальный идентификатор (имеется приблизительно 175 000 уникальных идентификаторов) и количество посещений (это их первое посещение , второй визит и т. д.?). Посещения ограничены пятью, поэтому максимальное значение в столбце visit.count меньше или равно пяти. Я хотел бы создать матрицу (или фрейм данных, если необходимо), в котором будет храниться самый последний счетчик посещений для каждого идентификатора; что-то вроде:

> head(data.matrix)
      ID  visit.count1 visit.count2 visit.count3 visit.count4 visit.count5
1 000001        0            1            0            0            0
2 000002        0            0            1            0            0
3 000003        1            0            0            0            0 

Мой код указан ниже:

ids <- unique(data$ID)
count.matrix <- matrix(data = 0, nrow = length(ids), ncol = 5)
for (i in 1:length(ids)){
ss <- subset(x = data, subset = data$ID==ids[i])
    ifelse(
            length(rownames(ss))==5, 
            count.matrix[i,5] <- 1, 
            ifelse(
                    length(rownames(ss))==4, 
                    count.matrix[i,4] <- 1, 
                    ifelse(
                            length(rownames(ss))==3, 
                            count.matrix[i,3] <- 1, 
                            ifelse(
                                    length(rownames(ss))==2, 
                                    count.matrix[i,2] <- 1, 
                                    count.matrix[i,1] <- 1
                            )
                    )
            )
    )
}

Как я могу улучшить это?

Ответы [ 3 ]

5 голосов
/ 18 апреля 2011

Если вам не нужны отдельные столбцы,

tapply(data$visit.ccount, data$ID, max)

проделает долгий путь.Если вы это сделаете, вы можете использовать его для создания «колоночной версии».

0 голосов
/ 18 апреля 2011

Если вы сортируете по количеству посещений, а затем удаляете дубликаты (меньшее количество посещений):

data2 <- data[order(data$visit.count,decreasing=T),]
data2 <- data2[!duplicated(data2$ID),]
0 голосов
/ 18 апреля 2011

Вы можете использовать table функцию

tb <- table(data$ID)
data.matrix <- data.frame(
    ID = names(tb),
    visit.count1 = as.numeric(tb==1),
    visit.count2 = as.numeric(tb==2),
    visit.count3 = as.numeric(tb==3),
    visit.count4 = as.numeric(tb==4),
    visit.count5 = as.numeric(tb==5)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...