在R:dcast函数中,传递列名称(再次!)

时间:2015-07-08 14:15:56

标签: r function casting arguments reshape2

给出具有id变量ab的半长格式的df以及列m1m2中的测量数据。数据类型由变量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中的行和值作为列来制作广泛的值格式:

> 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(row,column和value.var)的参数作为参数提供,如:

fun <- function(df,row,col,val){
  require(reshape2)
  res <-
    dcast(df, row~col, value.var=val)
  return(res)
}

我检查了herehere以尝试match.calleval(substitute())的变体,以便&#34;得到&#34;函数内部的参数,也尝试使用lazyeval包。没有成功。

我在这里做错了什么?如何让dcast识别变量名?

1 个答案:

答案 0 :(得分:10)

公式参数也接受字符输入。

foo <- function(df, id, measure, val) {
    dcast(df, paste(paste(id, collapse = " + "), "~", 
                    paste(measure, collapse = " + ")), 
          value.var = val)
}

require(reshape2)
foo(df_l, "a", "v", "m1")

请注意,data.table的{​​{1}}(current development)也可以直接投放多个dcast列。所以,你也可以这样做:

value.var