任何人都可以建议更快的方式迭代或循环这个数据框架?

时间:2011-04-18 14:25:00

标签: r

我的数据框大约有500,000行和4列。数据框包含有关特定用户访问某个位置的数据。数据框的样本如下:

> 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),他们的访问日期,他们的唯一ID(大约有175,000个唯一ID)和访问次数(是他们的第一次访问) ,第二次访问等?)。访问次数上限为5,因此visit.count列中的最大值小于或等于5。我想创建一个矩阵(或数据帧,如果需要),它存储每个ID的最新访问次数;类似的东西:

> 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 个答案:

答案 0 :(得分:5)

如果您不需要单独的列,

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

应该让你走很远的路。 如果这样做,您可以使用它来基于“列化版本”。

答案 1 :(得分:0)

您可以使用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)
    )

答案 2 :(得分:0)

如果按照vist计数排序,然后删除重复项(较低的访问次数):

data2 <- data[order(data$visit.count,decreasing=T),]
data2 <- data2[!duplicated(data2$ID),]