生成数据集

时间:2017-11-08 01:28:11

标签: r dataframe foreach

我有一个由项目(行)组成的数据集,这些数据集仅使用0到4的整数(表示我的离散变量的度数)进行分类。我有两年的数据,1980年和1996年(专栏)。

df <- read.table(text = "
1980  1996
1    1
2    4
4    1", header = T)

我的目标是为1984,1988和1992年的中间年份生成数据。

df.new <- data.frame(X1980 = NULL, X1984 = NULL, X1988 = NULL, X1992 = NULL, X1996 = NULL)

然而,要使这个虚拟数据基于现实,它必须遵循3条法则:

  • 1980年和1996年分配相同整数的项目在整个期间保持不变
  • 从1980年到1996年增加或减少的项目,在给定的时间步长中只能改变一个整数(项目不能跳过整数)。
  • 项目只能增加或减少(项目必须是单调的)

实现这一点我正在使用:

for(i in 1:nrow(df)){

lst <- ifelse(df$X1980[i] > df$X1996[i], 
              list(sort(sample(df$X1980[i]:df$X1996[i],3,replace = T), decreasing = T)),
              list(sort(sample(df$X1980[i]:df$X1996[i],3,replace = T), decreasing = F)))

  lst <- c(df$X1980[i], unlist(lst), df$X1996[i])

  df.new <- rbind(df.new, data.frame(X1980 = lst[1], 
                                 X1984 = lst[2], 
                                 X1988 = lst[3], 
                                 X1992 = lst[4], 
                                 X1996 = lst[5]))
}

这似乎运作良好,因为df.new产生:

  X1980 X1984 X1988 X1992 X1996
1     1     1     1     1     1
2     2     3     4     4     4
3     4     4     3     2     1

此数据集当然有多种变体符合我的3条法则。

我应该如何编写一个循环,允许我生成sim = 1000法律,持续迭代此数据集?

我如何确定没有任何项目(在任何数据库中)违反我的3条法律?

目前在循环之前尝试results <- foreach (i = 1:sim, .combine="df") %dopar%但到目前为止都没有成功。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

你可以这样做:

library(foreach)
results <- foreach(i = 1:100) %dopar% {
  foreach(i = 1:nrow(df), .combine = "rbind") %do% {

    lst <- ifelse(df$X1980[i] > df$X1996[i], 
                  list(sort(sample(df$X1980[i]:df$X1996[i],3,replace = T), decreasing = T)),
                  list(sort(sample(df$X1980[i]:df$X1996[i],3,replace = T), decreasing = F)))

    lst <- c(df$X1980[i], unlist(lst), df$X1996[i])

    data.frame(X1980 = lst[1], 
               X1984 = lst[2], 
               X1988 = lst[3], 
               X1992 = lst[4], 
               X1996 = lst[5])
  }
}
do.call("rbind", results)

foreach的工作方式与lapply类似,它会将您从表达式返回的内容(最后一个元素)放入列表中。