我有一个由项目(行)组成的数据集,这些数据集仅使用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条法则:
实现这一点我正在使用:
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%
但到目前为止都没有成功。
非常感谢任何帮助或建议。
答案 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
类似,它会将您从表达式返回的内容(最后一个元素)放入列表中。