【发布时间】:2020-12-30 22:10:03
【问题描述】:
我有 3 个人的一些 DNA 数据(等位基因),每行代表一个 SNP。为了获得一些可共享的测试数据,我想将数据按行随机抽样到一个新的 tibble 中,以获取一些不代表真人的假 DNA 数据。
例如,我最初的 tibble data 可能如下所示:
person_1, person_2, person_3
AA, AG, GG (i.e. data from person_1 person_2 person_3)
AC, CC, AC (i.e. data from person_1 person_2 person_3)
.. .. ..
我希望结果是这样的:
random_1, random_2, random_3
GG, AA, AG (i.e. randomly assigned to person_3, person_1, person_2)
CC, AC, AC (i.e. randomly assigned to person_2, person_3, person_1)
...
我已经可以用下面的代码做到这一点:
data %>%
split(f = 1:nrow(.)) %>%
purrr::map_dfr(~ .x[,sample(1:ncol(.x),ncol(.x))] %>%
rename( setNames(object = names(.),
nm = paste0("test_",sprintf("%02d", 1:length(.))))
)
)
但是,我的挑战是我的 tibble 有超过 700.000 行,这使得上面的代码非常慢。我曾尝试通过dplyr 包中的mutate()、rowwise() 和across 进行操作,但没有成功。
对其他更快的方法有什么建议吗?
【问题讨论】:
-
元素是指观察/行吗?
-
我的意思是每一行中的观察 - 所以我希望,对于我的 tibble 中的每一行,返回一个与原始行长度相同的新行,但新行中的观察是随机的从旧行采样。然后对 tibble 中的每一行重复此操作。希望这是有道理的(我试图通过上面的例子来澄清这一点)