【发布时间】:2018-07-15 06:01:01
【问题描述】:
我有一个小玩意
raw.tb
#> # A tibble: 10 x 4
#> geno ind X Y
#> * <fctr> <fctr> <int> <int>
#> 1 san1w16 A1 467 383
#> 2 san1w16 A1 465 378
#> 3 san1w16 B1 464 378
#> 4 san1w16 B1 464 377
#> 5 san2w16 A1 464 376
#> 6 san2w16 A1 464 375
#> 7 san2w16 B1 463 375
#> 8 san2w16 B1 463 374
#> 9 san3w16 A1 463 373
#> 10 san3w16 A1 463 372
我想使用 tidyverse 替换两个 for 循环的用法。我正在使用一个需要 2x2 矩阵的函数(它可以是任何函数 - 在这种特定情况下它是 momocs::coo_rotate)。
我想做的可以这样写在base R中:
for(g in unique(raw.tb$geno)){
for(i in unique(raw.tb[raw.tb$geno == g,]$ind){
raw.tb[raw.tb$geno == g & raw.tb$ind == i,c(3,4)] = some.function.for.a.matrix(raw.tb[raw.tb$geno == g & raw.tb$ind == i,c(3,4)])
}
}
我猜这可以使用 tidyverse 来完成,但是我已经研究过将 group_by() 与 do() 和 nest 与 map 一起使用,但我无法使其工作。
【问题讨论】:
-
看来您需要按摘要分组
-
你的意思是使用
dplyr::summarise? -
您的循环不起作用?你能发布你想要的结果吗?
-
是的,没错
-
@EricFail 我刚刚尝试了这个循环并且它有效:
for(g in unique(raw.tb$geno)){ for(i in unique(raw.tb[raw.tb$geno == g,]$ind)){ raw.tb[raw.tb$geno == g & raw.tb$ind == i,c(3,4)] = t( raw.tb[raw.tb$geno == g & raw.tb$ind == i,c(3,4)]) } }@akrun,如果我理解它的作用,summarise的问题在于它每组返回一个值,而我希望返回与我的组矩阵大小相同的矩阵
标签: r for-loop dplyr tidyverse purrr