Дан df в полудлинном формате с идентификаторами переменных a
и b
и измеренными данными в столбцах m1
и m2
. Тип данных задается переменной v
(значения var1 и var2).
set.seed(8)
df_l <-
data.frame(
a = rep(sample(LETTERS,5),2),
b = rep(sample(letters,5),2),
v = c(rep("var1",5),rep("var2",5)),
m1 = sample(1:10,10,F),
m2 = sample(20:40,10,F))
Выглядит как:
a b v m1 m2
1 W r var1 3 40
2 N l var1 6 32
3 R a var1 9 28
4 F g var1 5 21
5 E u var1 4 38
6 W r var2 1 35
7 N l var2 8 33
8 R a var2 10 29
9 F g var2 7 30
10 E u var2 2 23
Если я хочу сделать широкий формат значений в m1
, используя идентификатор a
в качестве строк и значений в столбцах v1
as, я делаю:
> reshape2::dcast(df_l, a~v, value.var="m1")
a var1 var2
1 E 4 2
2 F 5 7
3 N 6 8
4 R 9 10
5 W 3 1
Как мне написать функцию, которая делает это, если аргументы для dcast
(строка, столбец и значение.var) предоставляются в качестве аргументов, что-то вроде:
fun <- function(df,row,col,val){
require(reshape2)
res <-
dcast(df, row~col, value.var=val)
return(res)
}
Я проверил SO здесь и здесь попробовать варианты match.call
и eval(substitute())
, чтобы "получить" аргументы внутри функции, а также пробовал с пакетом lazyeval. Нет успеха.
Что я здесь делаю неправильно? Как заставить dcast распознавать имена переменных?