我认为我误解了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
,但我没有取得任何成功。
答案 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_df
是cross
的一个版本,后来简化为数据框,与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。