R 从列表中生成变量的每个组合
我有一张类似这样的清单R 从列表中生成变量的每个组合,r,dplyr,tidyverse,purrr,R,Dplyr,Tidyverse,Purrr,我有一张类似这样的清单 $mpg mpg_0.01 mpg_0.25 mpg_0.5 1 0.210 5.250 10.50 2 0.210 5.250 10.50 3 0.228 5.700 11.40 4 0.214 5.350 10.70 5 0.187 4.675 9.35 6 0.181 4.525 9.05 $cyl cyl_0.01 cyl_0.25 cyl_0.5 1
$mpg
mpg_0.01 mpg_0.25 mpg_0.5
1 0.210 5.250 10.50
2 0.210 5.250 10.50
3 0.228 5.700 11.40
4 0.214 5.350 10.70
5 0.187 4.675 9.35
6 0.181 4.525 9.05
$cyl
cyl_0.01 cyl_0.25 cyl_0.5
1 0.06 1.5 3
2 0.06 1.5 3
3 0.04 1.0 2
4 0.06 1.5 3
5 0.08 2.0 4
6 0.06 1.5 3
我想创建一个新的列表,每个元素都是与原始列表不同的变量组合,以如下方式结束:
$`1`
mpg_01 cyl_25
1 0.210 1.5
2 0.210 1.5
3 0.228 1.0
4 0.214 1.5
5 0.187 2.0
$`2`
mpg_01 cyl_5
1 0.210 3
2 0.210 3
3 0.228 2
4 0.214 3
5 0.187 4
$`3`
mpg_25 cyl_5
1 5.250 3
2 5.250 3
3 5.700 2
4 5.350 3
5 4.675 4
...
列表中变量的顺序无关紧要,因此我们只需要(mpg_01,cyl_5)或(cyl_5,mpg_01)中的一个
我认为使用cross
frompurr
可以满足我的需要,但不需要使用列名
以下是一些示例数据:
library(tidyverse)
df <- list(
mpg =
mtcars %>%
head() %>%
transmute(
mpg_0.01 = mpg * 0.01,
mpg_0.25 = mpg * 0.25,
mpg_0.5 = mpg * 0.5
),
cyl =
mtcars %>%
head() %>%
transmute(
cyl_0.01 = cyl * 0.01,
cyl_0.25 = cyl * 0.25,
cyl_0.5 = cyl * 0.5
)
)
库(tidyverse)
df%
头()%>%
蜕变(
mpg_0.01=mpg*0.01,
mpg_0.25=mpg*0.25,
mpg_0.5=mpg*0.5
),
共青团=
mtcars%>%
头()%>%
蜕变(
cyl_0.01=cyl*0.01,
气缸0.25=气缸*0.25,
气缸0.5=气缸*0.5
)
)
combin\u mat我们可以在每个列表上使用cross
,然后使用bind\u cols
library(purrr)
df1 <- cross(df) %>% map(dplyr::bind_cols)
谢谢,但是如果我的列表有100多个元素,并且经常更改,该怎么办?必须键入名称(df[[1]]、名称(df[[2]]、名称(df[[3]])…
@Shinobi_Atobe进行一些快速更新。。这有点复杂,但自动化程度更高。谢谢,但这并没有保留列名称啊…我明白了。我现在又重读了你的帖子。如果以后可以重命名这些列,可以吗?
library(purrr)
df1 <- cross(df) %>% map(dplyr::bind_cols)
map2(df1, cross(map(df, names)), setNames)
#[[1]]
# A tibble: 6 x 2
# mpg_0.01 cyl_0.01
# <dbl> <dbl>
#1 0.21 0.06
#2 0.21 0.06
#3 0.228 0.04
#4 0.214 0.06
#5 0.187 0.08
#6 0.181 0.06
#[[2]]
# A tibble: 6 x 2
# mpg_0.25 cyl_0.01
# <dbl> <dbl>
#1 5.25 0.06
#2 5.25 0.06
#3 5.7 0.04
#4 5.35 0.06
#5 4.68 0.08
#6 4.53 0.06
#...