2013-06-24 61 views
2

我有一个由2000个人组成的数据集。对于每个人,i:2000,数据集包含n重复的情况。令d表示这个数据集,d的每一行索引为in。在其他变量中,d具有变量pid,该变量对于不同(情境)行中的个体具有相同的值。重新采样面板维数据框


考虑到数据的面板性质,我想重新样品d(如在自举):

  • 与更换,
  • 存储每个重新采样的数据作为数据帧

我考虑使用sample函数,但无法使其工作。我是r的新用户,没有编程技能。

数据集由许多变量组成,但所有变量都有数字值。数据集如下。

pid x y z 
    1 10 2 -5 
    1 12 3 -4.5 
    1 14 4 -4 
    1 16 5 -3.5 
    1 18 6 -3 
    1 20 7 -2.5 
    2 22 8 -2 
    2 24 9 -1.5 
    2 26 10 -1 
    2 28 11 -0.5 
    2 30 12 0 
    2 32 13 0.5 

前六行是第一人,为此pid=1,和下一行性,pid=2是第二个人不同意见。

+1

使用'head(d)'向我们展示数据集前六行的示例。你也可以使用'str(d)'来检查d的结构,所以我们知道哪些列是数字,字符串,因素等。最后,使用'dput(d)'(或'dput(d [1:10, ])'),以便我们可以轻松地在*您的*数据上尝试我们的解决方案。 – MrGumble

+0

我希望这是有帮助的。我无法解决您的所有请求。 – Duna

+1

你想存档什​​么样的采样?从2000年以后选择n个人并保留所有观察结果?为每个人选择m个观察值?两者的结合? – Thilo

回答

0

这应该为你工作:

z <- replicate(100, 
       d[d$pid %in% sample(unique(d$pid), 2000, replace=TRUE),], 
       simplify = FALSE) 

结果z将dataframes你可以做任何与清单。

编辑:这是一个罗嗦,但将处理重复的行。 replicate有明显的使用执行设定操作给定的次数(在下面的例子中,4)。我然后samplepid(在这种情况下,这些值中的3个,替换)的唯一值,并提取d行对应于每个采样值。 do.callrbindlapply的组合处理上述代码无法处理的重复项。因此,该代码不是生成具有可能不同长度的数据帧,而是针对每个采样pid生成数据帧,然后使用do.call("rbind",...)replicate的每次迭代内将它们粘在一起。

z <- replicate(4, do.call("rbind", lapply(sample(unique(d$pid),3,replace=TRUE), 
            function(x) d[d$pid==x,])), 
            simplify=FALSE) 
+0

当我运行您的代码时,如下所示 'z < - replicate(4,#4 resamples d [d $ pid%in%sample(unique(d $ pid),3,replace = TRUE),],#for每个唯一值在d:1-3 simplification = FALSE)我有4个resamples,但并不是所有的行都是相同的。 – Duna

+0

看我的编辑是否符合你的要求。 – Thomas

+0

这是按我的意思工作,谢谢。我更多的口头解释会很棒。 – Duna