2012-04-23 71 views
0

我的大部分问题都是如何提取和组织数据,没有事先培训,我为我无法清楚表达我想要的内容而道歉。我希望我甚至能够知道如何用文字或在线阅读文章。这里是我的问题现在:如何在r中对子集和组进行循环?

我有一个信息数据框有一个唯一的组ID为ID,有153个唯一的ID,但我有来自这些组的信息> 6000行。

我想要做的是每次从2组中获取所有信息,并写出一个包含所有相关信息的简单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”。我知道,循环笨重,我曾想过也许ddply可能工作,甚至是一个命令而不是子集。由于在R中有很多方法可以做事,我不知道甚至可以称之为我想做的事情。我想我有办法让它变得复杂。

我一直在寻找答案,并将其作为可能性发现,但不知道如何让它一次写入超过1组的信息,而且我不清楚函数(x)命令正在做:

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

您是否需要将所有可能的组标识对的数据保存在不同的文件中? – DrDom 2012-04-23 19:14:14

+0

我可能不会这样做,但你可以使用while循环代替。 – 2012-04-23 19:15:08

+0

@DrDom不,不是所有可能的对,只是按顺序依次处理列表 - 生成一个文件,其中包含来自组1和2的信息,然后是来自组3和4的文件,然后是来自5和6的文件。 – Kerry 2012-04-23 19:17:51

回答

1

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

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的

+0

应该粘贴(IDgp [i]'粘贴(ID [i]'或者可能'粘贴(ID [i],ID [i + 1]'?(ps某种程度上我的编辑没有被保存 - 对不起第二次尝试) – BenBarnes 2012-04-23 19:37:09

+0

是的,真的!我只是复制粘贴的原始代码。感谢您的更正。 – DrDom 2012-04-23 19:39:35

+0

@DrDom当我运行这个脚本时,这些文件是空的,它们的标题是正确的命名法,但nadda是数据。 – Kerry 2012-04-23 19:49:36

1

下面是建立从你的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,])) 

你” d明显地将上面的print函数替换为适合您需要的任何内容。