R 将字符串列表拆分为分区

R 将字符串列表拆分为分区,r,subset,plyr,data.table,R,Subset,Plyr,Data.table,这是我的问题。我有一个20万行的数据集 每行对应于对受试者进行的测试 受试者的测试次数不等 每次测试都注明日期 我想为每个测试分配一个索引。例如,受试者1的第一次测试为1,受试者1的第二次测试为2。受试者2的第一次测试为1等 我的策略是获得唯一主题ID的列表,使用lapply将数据集子集为使用唯一主题ID的数据帧列表,每个主题都有自己的数据帧,并进行测试。理想情况下,我将能够对每个主题的每个数据帧进行排序,并为每个测试分配一个索引 然而,在200kx32数据帧上执行此操作使我的笔记本电脑(i

这是我的问题。我有一个20万行的数据集

  • 每行对应于对受试者进行的测试
  • 受试者的测试次数不等
  • 每次测试都注明日期
我想为每个测试分配一个索引。例如,受试者1的第一次测试为1,受试者1的第二次测试为2。受试者2的第一次测试为1等

我的策略是获得唯一主题ID的列表,使用lapply将数据集子集为使用唯一主题ID的数据帧列表,每个主题都有自己的数据帧,并进行测试。理想情况下,我将能够对每个主题的每个数据帧进行排序,并为每个测试分配一个索引

然而,在200kx32数据帧上执行此操作使我的笔记本电脑(i5、Sandy Bridge、4GB ram)很快就耗尽了内存

我有两个问题:

  • 有更好的方法吗
  • 如果没有,我唯一能克服内存限制的方法就是将我唯一的主题列表分解成更小的集合,比如每个列表1000个主题,在数据集中重复,最后将列表连接在一起。那么,我如何创建一个函数,通过提供一个表示分区数的整数来打破我的主题列表呢。e、 g.BreakPartition(数据集,5)将数据集平均分成5个分区
  • 下面是生成一些虚拟数据的代码:

    UniqueSubjectID <- sapply(1:500, function(i) paste(letters[sample(1:26, 5, replace = TRUE)], collapse =""))
    UniqueSubjectID <- subset(UniqueSubjectID, !duplicated(UniqueSubjectID))
    Dataset <- data.frame(SubID = sample(sapply(1:500, function(i) paste(letters[sample(1:26, 5, replace = TRUE)], collapse ="")),5000, replace = TRUE))
    Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d.%m.%Y')), 5000, replace = TRUE)
    Dataset <- cbind(Dataset, Dates)
    

    UniqueSubjectID这听起来像是
    plyr
    软件包的工作。我将以以下方式添加索引:

    require(plyr)
    system.time(new_dat <- ddply(Dataset, .(SubID), function(dum) {
        dum = dum[order(dum$SubID, dum$Dates), ]
        mutate(dum, index = 1:nrow(dum))
      }))
    
    require(plyr)
    
    Simult.Time:NexydAt>P>我猜想SPLI/LAPIE是使用内存的方法。你应该考虑一种更矢量化的方法。从你的示例代码稍微修改的版本开始:

    n <- 200000
    UniqueSubjectID <- replicate(500, paste(letters[sample(26, 5, replace=TRUE)], collapse =""))
    UniqueSubjectID <- unique(UniqueSubjectID)
    Dataset <- data.frame(SubID = sample(UniqueSubjectID , n, replace = TRUE))
    Dataset$Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d.%m.%Y')), n, replace = TRUE)
    

    n在您的示例中运行
    ddply
    代码在我的机器(i5 3.2 GHz)上只需不到一秒钟的时间.根据我的经验,ddply比矢量化方法速度慢,占用的内存也更多。但它确实有很好的语法。我认为我的机器比你的机器慢很多,我有一个1.8 GHz的Core 2 duo。我承认我最初没有进行速度测试,但非正式地比较了ddply方法和rle方法,并进行了一些运行和系统测试。tim在我的计算机上,e给出的运行时间分别为4.2秒和0.9秒。可能使用
    数据的方法。table
    甚至可以节省更多的时间(我想),尤其是当数据集变得越来越大时。这似乎完全有可能。谢谢大家!这解决了我的问题,并教会了我如何使用rle。@PaulHiemstra您如何使用data.table来加快速度?我试图将数据帧制作成数据表,并通过相同的命令运行,但差别可以忽略不计。
    Dataset <- Dataset[order(Dataset$SubID, Dataset$Dates), ]
    ids.rle <- rle(as.character(Dataset$SubID))
    Dataset$SubIndex <- unlist(sapply(ids.rle$lengths, function(n) 1:n))