下面是使用一些更concises解決方案tidyverse
工具
set.seed(1)
data <- data.frame(group1 = sample(c("A","B"),10,T),
group2 = sample(c("A","B"),10,T),
var1 = sample(10),
var2 = sample(10),
var3 = sample(10),
var4 = sample(10))
library(dplyr, warn.conflicts = F)
創建的功能列表,並應用於列的一個子集首先解決
使用summarise_at
functionnalities
summarise_fun <- funs(
mean = Rmisc::CI(., ci=0.95)['mean'],
lower = Rmisc::CI(., ci=0.95)['lower'],
upper = Rmisc::CI(., ci=0.95)['upper'])
summary_CI <- data %>%
group_by(group1, group2) %>%
summarize_at(vars(num_range("var", 1:3)), summarise_fun)
summary_CI
#> # A tibble: 4 x 11
#> # Groups: group1 [?]
#> group1 group2 var1_mean var2_mean var3_mean var1_lower var2_lower
#> <fctr> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 A A 6.0 5.500000 7.500000 -44.824819 -0.8531024
#> 2 A B 6.5 6.500000 6.500000 -25.265512 -37.9717166
#> 3 B A 4.0 5.666667 5.666667 -4.956686 -2.3187188
#> 4 B B 6.0 4.666667 3.333333 3.515862 -5.3728564
#> # ... with 4 more variables: var3_lower <dbl>, var1_upper <dbl>,
#> # var2_upper <dbl>, var3_upper <dbl>
,您可以後一個總結連接上VAR4
inner_join(summary_CI,
data %>%
group_by(group1, group2) %>%
summarize_at("var4", sum),
by = c("group1", "group2"))
#> # A tibble: 4 x 12
#> # Groups: group1 [?]
#> group1 group2 var1_mean var2_mean var3_mean var1_lower var2_lower
#> <fctr> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 A A 6.0 5.500000 7.500000 -44.824819 -0.8531024
#> 2 A B 6.5 6.500000 6.500000 -25.265512 -37.9717166
#> 3 B A 4.0 5.666667 5.666667 -4.956686 -2.3187188
#> 4 B B 6.0 4.666667 3.333333 3.515862 -5.3728564
#> # ... with 5 more variables: var3_lower <dbl>, var1_upper <dbl>,
#> # var2_upper <dbl>, var3_upper <dbl>, var4 <int>
第二種解決方案:使用函數式編程更簡潔purrr
基本上,它在一個塊中完成了解決方案1中的工作。它在.vars
和.funs
的列表中使用了參數summarise_at
。結果是一個數據列表。框,你可以結合在一起以加入
library(purrr)
lst(.vars = lst(vars(num_range("var", 1:3)), "var4"),
.fun = lst(summarise_fun, sum)) %>%
pmap(~ data %>%
group_by(group1, group2) %>%
summarise_at(.x, .y)) %>%
reduce(inner_join, by = c("group1", "group2"))
#> # A tibble: 4 x 12
#> # Groups: group1 [?]
#> group1 group2 var1_mean var2_mean var3_mean var1_lower var2_lower
#> <fctr> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 A A 6.0 5.500000 7.500000 -44.824819 -0.8531024
#> 2 A B 6.5 6.500000 6.500000 -25.265512 -37.9717166
#> 3 B A 4.0 5.666667 5.666667 -4.956686 -2.3187188
#> 4 B B 6.0 4.666667 3.333333 3.515862 -5.3728564
#> # ... with 5 more variables: var3_lower <dbl>, var1_upper <dbl>,
#> # var2_upper <dbl>, var3_upper <dbl>, var4 <int>
Thanks @konvas。我現在無法測試,但我提供了更多信息,我會盡快查看。 –
@QuentinRoy沒有probs,我已經更新了我認爲會給你輸出所需的答案 – konvas
任何想法如何使用這種方法保持'var4'? –