[英]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变量a
和b
半长格式的df以及列m1
和m2
测量数据。 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.call
和eval(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.table
的dcast
( 当前开发 )也可以直接转换多个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.