我有一组带有因变量和两个因子的数据。我想在我的两个因子的每个组合子集中随机抽样因变量(有替换)(并且检索的随机样本的数量应该等于两个因子的每个组合最初存在的数量)。我已经能够使用'by'功能完成此操作。问题是输出是一个列表,我想要更容易访问的东西,但没有任何运气转换到数据框架。我的最终目标是运行上述模拟1000次,并且每次模拟计算为每个因子组合检索的随机样本的平均值。
这会生成数据集:
value<-runif(100,5,25)
cat1<-factor(rep(1:10,10))
a<-rep("A",50)
b<-rep("B",50)
cat2<-append(a,b)
data<-as.data.frame(cbind(value,cat1,cat2))
这创建了一个从因子水平和中抽取的随机值的模拟 将信息存储在列表中:
list<-by(data[,"value"],data[,c("cat1","cat2")],function(x) sample(x,length(x),T))
我想做的是结束一个包含“Simulation”,“AverageValue”,“cat1”和“cat2”列的数据框 - 这样我就可以为每个cat1组合提供1000条模拟线和猫2。
有关如何使'by'输出更易于访问的任何建议,以便我可以在输出或其他建议上运行for循环,这将是很棒的。
谢谢!
答案 0 :(得分:0)
作为一种更通用的方法,您可能希望使用dplyr
而不是by
。通过这种方式,您可以保留data.frame。
在这种情况下,您可以使用group_by
按cat1和cat2分组,而不是by
,并使用mutate
添加新列。如果您不想保留旧数据,可以将new =
替换为value =
:
library(dplyr)
data %>% group_by(cat1, cat2) %>%
mutate(new = sample(value, length(value), replace = T))
Source: local data frame [100 x 4]
Groups: cat1, cat2 [20]
value cat1 cat2 new
(fctr) (fctr) (fctr) (fctr)
1 13.9639607304707 1 A 13.2139691384509
2 22.6068278681487 2 A 5.27278678957373
3 24.6930849226192 3 A 22.0293137291446
4 16.842244095169 4 A 9.56347029190511
5 18.467006101273 5 A 23.1605510273948
6 20.6661582039669 6 A 24.3043746100739
7 9.37060782220215 7 A 13.9268753770739
8 6.68592340312898 8 A 20.034239795059
9 6.95704637560993 9 A 12.676755907014
10 17.2769332909957 10 A 24.453850784339
.. ... ... ...