在数据框中创建按​​因子级别从另一列进行采样的列

时间:2014-04-22 19:03:55

标签: r dataframe plyr random-sample

我希望我的数据框x3的列dat包含列x2的随机样本,但随机样本应仅来自列{{1}中给出的相同因子级别}}。我研究过函数x1by()ddply(),但似乎无法使其发挥作用。我还检查了similar question,但它没有帮助我。您可以在下面的(我希望的)上下文中看到我尝试过的内容。

以下是示例数据框:

sample()

然后我生成x3的一些非工作尝试如下:

dat <- data.frame(x1=c("a","a","a","b","b","b","c","c","c"),x2=1:9);
dat$x1 <- as.factor(dat$x1);
dat;
  x1 x2
1  a  1
2  a  2
3  a  3
4  b  4
5  b  5
6  b  6
7  c  7
8  c  8
9  c  9

我也试过这个

set.seed(99);
by(dat,FUN=dat$x1,dat$x3<-sample(dat$x1,1,replace=FALSE));  #this did not work at all

我在set.seed(99); a <- by(dat,dat[,"x1"],function(d){sample(d$x2,3,replace=FALSE)},simplify=TRUE); dat$x3<-a; a; dat[, "x1"]: a [1] 2 1 3 --------------------------------------------------------------------------------------------------- dat[, "x1"]: b [1] 6 5 4 --------------------------------------------------------------------------------------------------- dat[, "x1"]: c [1] 9 7 8 dat; > dat x1 x2 x3 1 a 1 2, 1, 3 2 a 2 6, 5, 4 3 a 3 9, 7, 8 4 b 4 2, 1, 3 5 b 5 6, 5, 4 6 b 6 9, 7, 8 7 c 7 2, 1, 3 8 c 8 6, 5, 4 9 c 9 9, 7, 8 得到了我需要的东西,因为因子级别的随机重采样存在,但a不是简单的向量。我觉得如果a是一个向量,我就会得到我需要的东西,因为我可以将它分配给a。总而言之,我希望dat能够像这样:

dat$x3

对于具有> 200万行的数据帧,该解决方案应该是高效的。感谢任何人的帮助。我希望随着r变得更好而将帮助归还给其他人。

1 个答案:

答案 0 :(得分:0)

 dat$x3 <- ave( dat$x2, dat$x1, FUN=sample)

构造输出的方式(与数据帧的行具有相同数量的条目),您将获得x1的不同值内的x2值的排列。 (编辑您的代码以使其运行。)