cross2()vs cross_df()用purrr做一个tibble

时间:2018-01-13 22:27:27

标签: r purrr

我认为我误解了patient = myContext.Patients.Where(w => w.PatientID ==PatientId).FirstOrDefault(); 应该如何运作。

举个例子,假设我有20家商店和104周。我想制作一个以商店和周数为列的元素。产生的tibble应为2列乘20 * 104行,以表示所有商店周。

我接近这个的方式是

purrr::cross_df()

问题是我希望这是一个不是列表的元素。我尝试将stores <- 1:20 weeks <- 1:104 cross2(stores,weeks) 替换为cross,但我没有取得任何成功。

1 个答案:

答案 0 :(得分:4)

如果您创建了一个命名列表,则可以将其传递到cross_df

library(purrr)

list(stores = 1:20, weeks = 1:104) %>% cross_df()
#> # A tibble: 2,080 x 2
#>    stores weeks
#>     <int> <int>
#>  1      1     1
#>  2      2     1
#>  3      3     1
#>  4      4     1
#>  5      5     1
#>  6      6     1
#>  7      7     1
#>  8      8     1
#>  9      9     1
#> 10     10     1
#> # ... with 2,070 more rows

可以使用cross2,但之后您需要将其强制转换为数据框。主要问题是结果列表元素没有名称,因此您需要重新添加它们以强制转换为数据框,例如

stores <- 1:20
weeks <- 1:104

cross2(stores, weeks) %>% map_df(set_names, c('stores', 'weeks'))

更长的解释是cross2执行传递它的向量的笛卡尔(交叉)连接,而cross对传递它的列表的元素执行相同的操作。 cross_dfcross的一个版本,后来简化为数据框,与map_df并行。

另外值得注意的是,基础R已经具有在expand.grid中进行交叉连接和获取数据帧的出色功能:

df <- expand.grid(stores = stores, weeks = weeks)

head(df)
#>   stores weeks
#> 1      1     1
#> 2      2     1
#> 3      3     1
#> 4      4     1
#> 5      5     1
#> 6      6     1

如果传入向量,如果要保留名称,则必须对其进行命名,但它也会使用cross之类的命名列表,并保留其名称,例如

df <- list(stores = 1:20, weeks = 1:104) %>% expand.grid()

所有结果都是相同的,只有expand.grid返回一个vanilla data.frame而不是一个tibble。