如何在r中使用循环进行子集和分组?

如何在r中使用循环进行子集和分组?,r,loops,batch-file,plyr,R,Loops,Batch File,Plyr,我的大部分问题只是如何提取和组织数据,没有经过任何培训,我很抱歉我无法清楚地表达我的想法。我希望我甚至知道如何用短语表达东西,以便在课本或网上查找它们。现在我的问题是: 我有一个信息的数据框,它有一个唯一的组id,称为id,有153个唯一id,但我有超过6000行来自这些组的信息 我想做的是一次从两个组中获取所有信息,并写出一个包含所有相关信息的简单csv文件。当总人数为奇数(n=153)时,这将如何工作 我是这样想的: IDs = unique(dat$ID) for (i in length

我的大部分问题只是如何提取和组织数据,没有经过任何培训,我很抱歉我无法清楚地表达我的想法。我希望我甚至知道如何用短语表达东西,以便在课本或网上查找它们。现在我的问题是:

我有一个信息的数据框,它有一个唯一的组id,称为id,有153个唯一id,但我有超过6000行来自这些组的信息

我想做的是一次从两个组中获取所有信息,并写出一个包含所有相关信息的简单csv文件。当总人数为奇数(n=153)时,这将如何工作

我是这样想的:

IDs = unique(dat$ID)
for (i in length(IDs)){
    IDgp = subset(dat, dat$ID==IDs[i] & dat$ID==IDs[i+1])
    write.csv(IDgp, paste(IDgp[i],".csv")
    i = i+2
    }
这是行不通的,我不知道如何让它增加到下一个“2人组”。我知道for循环很笨重,我曾想过ddply可能会工作,甚至可能是which命令而不是子集。因为在R中有很多方法可以做事情,所以我甚至不知道该怎么称呼我想做的事情。我想我已经把它复杂化了

我一直在寻找答案,发现这是可能的,但不知道如何让它一次写入多个组的信息,我不清楚function(x)命令在做什么:

d_ply(dat, "ID", function(x)
     write.csv(x[i], file = paste(x$ID[i], ".csv")
     , row.names = FALSE))

也许这会有帮助。但我认为有一个更优雅的方式来做到这一点

IDs = unique(dat$ID)
for (i in seq(1, length(IDs), 2)){
  write.csv(dat[dat$ID %in% IDs[i+c(0,1)], ], 
    paste(IDs[i], "_", IDs[i+1], ".csv", sep=""))
}

编辑以创建全长ID的序列这里有一种方法可以从您的ID构建适当维度的矩阵,然后在其中循环:

dat <- data.frame(id = 1:10, foo = runif(10))
#This will throw a warning if dimensions don't line up, not sure what you want to do with those
idpairs <- matrix(sort(unique(dat$id)), ncol = 2, byrow = TRUE)
> head(idpairs,2)
     [,1] [,2]
[1,]    1    2
[2,]    3    4
a_ply(idpairs, 1, function(x) print(dat[dat$id  %in% x,]))

dat您需要将所有可能的组ID对的数据保存在单独的文件中吗?我可能不会这样做,但您可以使用while循环来代替。@DrDom不,不是所有可能的组ID对,只需按顺序处理列表-生成一个包含第一组和第二组信息的文件,然后从第三组和第四组生成一个文件,然后从第五组和第六组生成一个文件。
zoo
包中的
rollappy
可以很好地实现这一点。应该
paste(IDgp[i]
be
paste(IDs[i]
)还是
paste(IDs[i],IDs[i+1]
?(注意,不知怎么的,我的编辑没有被保存-很抱歉第二次尝试)是的,真的!我只是复制了粘贴的原始代码。谢谢更正。@DrDom当我运行这个脚本时,文件是空的。它们的标题有正确的命名法,但数据是nadda。尝试将
dat$ID==IDs[I]&dat$ID==IDs[I+1]
更改为
dat$ID%,在%IDs[I+c]中(0,1)]
@DrDom在我运行循环之前,我必须创建一个空的数据帧吗?即使我只是运行行IDgp=subset(dat,dat$ID==IDs[I]&dat$ID==IDs[I+1]),然后输入IDgp,它会显示列名称,但显示数据(或0-length row.names)