简体   繁体   English

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

[英]In R: dcast in function, pass column names (again!)

Given a df in semi-long format with id variables a and b and measured data in columns m1 and m2 . 给出具有id变量ab半长格式的df以及列m1m2测量数据。 The type of data is specified by the variable v (values var1 and var2). 数据类型由变量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)) 

Looks as: 看起来像:

   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

If I want to make a wide format of values in m1 using id a as rows and values in v1 as columns I do: 如果我想在m1使用id 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

How do I write a function that does this were arguments to dcast (row, column and value.var) are supplied as arguments, something like: 如何编写一个函数来执行此操作, dcast (row,column和value.var)的参数作为参数提供,如:

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

I checked SO here and here to try variations of match.call and eval(substitute()) in order to "get" the arguments inside the function, and also tried with the lazyeval package. 这里检查了SO 在这里尝试使用match.calleval(substitute())变体来“获取”函数内部的参数,并尝试使用lazyeval包。 No succes. 没有成功。

What am I doing wrong here ? 我在这做错了什么? How to get dcast to recognize variable names? 如何让dcast识别变量名?

Formula argument also accepts character input. 公式参数也接受字符输入。

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")

Note that data.table 's dcast ( current development ) can also cast multiple value.var columns directly. 请注意, data.tabledcast当前开发 )也可以直接转换多个value.var列。 So, you can also do: 所以,你也可以这样做:

require(data.table) # v1.9.5
foo(setDT(df_l), "a", "v", c("m1", "m2"))
#    a m1_var1 m1_var2 m2_var1 m2_var2
# 1: F       1       6      28      21
# 2: H       9       2      38      29
# 3: M       5      10      24      35
# 4: O       8       3      23      26
# 5: T       4       7      31      39

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM