在函数R:dcast中,传递列名称(再次!) [英] In R: dcast in function, pass column names (again!)

查看:474
本文介绍了在函数R:dcast中,传递列名称(再次!)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定一个半长格式的df,其中包含ID变量 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))

看起来像:

  abv 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中生成宽格式的值使用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

如何编写函数这是否是作为参数提供给 dcast (row,column和value.var)的参数,如下所示:



< pre $ fun < - 函数(df,row,col,val){
require(reshape2)
res< -
dcast(df,










$ p>我检查过此处这里
a>来尝试 match.call eval(substitute())的变体,以便获取参数里面的功能,并尝试与lazyeval包。没有成功。



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

解决方案

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

  foo < - 函数(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 dcast 当前开发)也可以直接投射多个 value.var 列。所以,你也可以这样做:

  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


Given a df in semi-long format with id variables a and b and measured data in columns m1and m2. The type of data is specified by the variable v (values var1 and 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 v1as columns I do:

> 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:

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. No succes.

What am I doing wrong here ? How to get dcast to recognize variable names?

解决方案

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. 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

这篇关于在函数R:dcast中,传递列名称(再次!)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆