在 R: dcast in 函数中,传递列名(再次!)
In R: dcast in function, pass column names (again!)
给定一个带有 id 变量 a
和 b
的半长格式的 df 以及 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))
看起来像:
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
中使用 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
(行、列和 value.var)的参数作为参数提供,例如:
fun <- function(df,row,col,val){
require(reshape2)
res <-
dcast(df, row~col, value.var=val)
return(res)
}
我检查了 SO here and 以尝试 match.call
和 eval(substitute())
的变体以便 "get" 函数内的参数,并且还尝试了 lazyeval 包。没有成功。
我在这里做错了什么?如何让 dcast 识别变量名?
公式参数也接受字符输入。
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
的 dcast
(current development) 也可以直接转换多个 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
给定一个带有 id 变量 a
和 b
的半长格式的 df 以及 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))
看起来像:
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
中使用 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
(行、列和 value.var)的参数作为参数提供,例如:
fun <- function(df,row,col,val){
require(reshape2)
res <-
dcast(df, row~col, value.var=val)
return(res)
}
我检查了 SO here and match.call
和 eval(substitute())
的变体以便 "get" 函数内的参数,并且还尝试了 lazyeval 包。没有成功。
我在这里做错了什么?如何让 dcast 识别变量名?
公式参数也接受字符输入。
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
的 dcast
(current development) 也可以直接转换多个 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