在函数R:dcast中,传递列名称(再次!) [英] In R: dcast in function, pass column names (again!)
问题描述
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 m1
and 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 v1
as 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屋!