将一个id列包含到split.default结果列表的所有元素中的规范方法
我根据列名将 data.frame 拆分为一个列表。我想要的是将 id 列 ( id) 不仅包含在一个项目中,而且包含在结果列表的所有元素中。
目前我正在通过随后将id列绑定到列表的所有项目map和bind_cols(通过Map/ do.call/mapply等替代。我自己也可以这样做)。我想知道的是有什么直接的规范方法可以直接执行此操作,可能直接使用split.default其他函数的函数参数或直接通过其他函数,从而节省两三个额外步骤。
可重现的例子
df <- data.frame(
stringsAsFactors = FALSE,
id = c("A", "B", "C"),
nm1_a = c(928L, 476L, 928L),
nm1_b = c(61L, 362L, 398L),
nm2_a = c(965L, 466L, 369L),
nm2_b = c(240L, 375L, 904L),
nm3_a = c(429L, 730L, 788L),
nm3_b = c(99L, 896L, 540L),
nm3_c = c(463L, 143L, 870L)
)
df
#> id nm1_a nm1_b nm2_a nm2_b nm3_a nm3_b nm3_c
#> 1 A 928 61 965 240 429 99 463
#> 2 B 476 362 466 375 730 896 143
#> 3 C 928 398 369 904 788 540 870
我现在在做什么
library(tidyverse)
split.default(df[-1], gsub('^(nmd+).*', '1', names(df)[-1])) %>%
map(~ .x %>% bind_cols('id' = df$id, .))
#> $nm1
#> id nm1_a nm1_b
#> 1 A 928 61
#> 2 B 476 362
#> 3 C 928 398
#>
#> $nm2
#> id nm2_a nm2_b
#> 1 A 965 240
#> 2 B 466 375
#> 3 C 369 904
#>
#> $nm3
#> id nm3_a nm3_b nm3_c
#> 1 A 429 99 463
#> 2 B 730 896 143
#> 3 C 788 540 870
我想要的是完全相同的输出,但是有什么方法可以直接或更规范地做到这一点?