![](/img/trans.png)
[英]R - replace and delete first and last percentile in dataframe or multiple columns at once
[英]Pass multiple columns in dataframe into function at once in R
經過大量搜索,我似乎無法弄清楚。 嘗試編寫一個函數:
這是我的職能,
myfun <- function(db,var1, ...) {
var1 <- enquo(var1)
var2 <- quos(...)
for (i in var2) {
db %>%
group_by(!!var1) %>%
summarise(mean_var = mean(!!!var2))
}}
當我通過以下內容時,沒有任何回報
myfun(data, group, age, bmi)
理想情況下,我希望將age和bmi分組,並分別返回其均值和sd。 將來,我想將更多列從數據傳遞到函數中。
輸出將與doby包中的summaryBy相似,但同時在許多列上將顯示為:
Group age.mean age.sd
0
1
bmi.mean bmi.sd
0
1
您的循環似乎是不必要的(您沒有對i
進行任何操作)。 相反,您可以使用summarize_at
達到所需的效果:
myfun <- function(db,var1, ...) {
var1 <- enquo(var1)
var2 <- quos(...)
db %>%
group_by(!!var1) %>%
summarise_at(vars(!!!var2), c(mean = mean, sd = sd))
}
如果我們用鑽石數據集進行測試:
myfun(diamonds, cut, x, z)
cut x_mean z_mean x_sd z_sd
<ord> <dbl> <dbl> <dbl> <dbl>
1 Fair 6.25 3.98 0.964 0.652
2 Good 5.84 3.64 1.06 0.655
3 Very Good 5.74 3.56 1.10 0.730
4 Premium 5.97 3.65 1.19 0.731
5 Ideal 5.51 3.40 1.06 0.658
為了使格式更接近您在原始帖子中所想到的格式,我們可以使用一些tidyr魔術:
myfun <- function(db,var1, ...) {
var1 <- enquo(var1)
var2 <- quos(...)
db %>%
group_by(!!var1) %>%
summarise_at(vars(!!!var2), c(mean = mean, sd = sd)) %>%
gather(variable, value, -(!!var1)) %>%
separate(variable, c('variable', 'measure'), sep = '_') %>%
spread(measure, value) %>%
arrange(variable, !!var1)
}
cut variable mean sd
<ord> <chr> <dbl> <dbl>
1 Fair x 6.25 0.964
2 Good x 5.84 1.06
3 Very Good x 5.74 1.10
4 Premium x 5.97 1.19
5 Ideal x 5.51 1.06
6 Fair z 3.98 0.652
7 Good z 3.64 0.655
8 Very Good z 3.56 0.730
9 Premium z 3.65 0.731
10 Ideal z 3.40 0.658
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.