【发布时间】:2018-06-05 15:23:16
【问题描述】:
我正在尝试生成一个用于测试的假数据集。
生成所有组合中存在的列很容易:
subject <- 1:5
visit <- c("D0", "D100", "D500")
isotype <- c("IgG", "IgA", "IgM", "IgD)
testdata <- expand.grid(subject, visit, isotype)
names(testdata) <- c("subject", "visit", "isotype")
现在我需要再创建两列; “积极性”对“访问”中的每个组具有特定值,“响应”使用随机整数,其范围取决于“访问”中的每个组。
对于“积极性”,我可以这样做:
testdata[testdata$visit == "D0", c("positivity")] <- NA
testdata[testdata$visit == "D100", c("positivity")] <- 1
testdata[testdata$visit == "D500", c("positivity")] <- 0
对于“响应”,我可以这样做:
testdata[testdata$visit == "D0", c("response")] <- sample(1:100, 1)
testdata[testdata$visit == "D100", c("response")] <- sample(20000:30000, 1)
testdata[testdata$visit == "D500", c("response")] <- sample(1:100, 1)
但实际上,在“访问”中,我有更多独特的观察结果,而这将永远持续下去。我希望我可以使用 dplyr 和 group_by 循环遍历每个组并从向量中分配“积极性”,因为该向量的长度应该等于“访问”中的组数并使用范围向量分配“响应”为样本方法。
positivityvalues <- c(NA, 1, 0)
responseranges <- c(1:100, 1:500, 1:100)
testdata <- testdata %>%
group_by(visit) %>%
mutate(#i can't figure out what to put here
#positivity[1] = positivityvalues[1] etc...
#response[1] = sample(responseranges[1], 1) etc...
)
为了得到这样的东西(为了清楚起见,只列出了前两个主题和同种型)
subject visit isotype positivity response
1 D0 IgG NA 58
1 D100 IgG 1 27093
1 D500 IgG 0 2
1 D0 IgA NA 42
1 D100 IgA 1 28921
1 D500 IgA 0 85
2 D0 IgG NA 86
2 D100 IgG 1 26039
2 D500 IgG 0 54
2 D0 IgA NA 99
2 D100 IgA 1 29021
2 D500 IgA 0 23
谢谢
编辑*完成的更新
Edit2* 解决方案:
ranges <- list(D0=c(1:100), D100=c(25000:32000), D500=c(1:100))
positives <- c(D0=NA, D100=1, D500=0)
testdata$positivity <- positives[testdata$visit]
testdata$responsetemp <- ranges[testdata$visit]
testdata$reponse <- lapply(testdata$responsetemp, function(x) sample(x, 1))
【问题讨论】:
-
你能提供你预期的输出吗?
-
您需要更改列名
-
如果访问列的唯一值比较多,对应的值应该是多少
-
更新列名并添加示例输出