我希望我的数据框x3
的列dat
包含列x2
的随机样本,但随机样本应仅来自列{{1}中给出的相同因子级别}}。我研究过函数x1
,by()
和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变得更好而将帮助归还给其他人。
答案 0 :(得分:0)
dat$x3 <- ave( dat$x2, dat$x1, FUN=sample)
构造输出的方式(与数据帧的行具有相同数量的条目),您将获得x1的不同值内的x2值的排列。 (编辑您的代码以使其运行。)