假设我有一个数据框df
,其中包含许多标识变量(在列中),只有少数测量变量(也在列中)。
为避免重复输入每个参数的所有变量,我将识别和测量df
列的名称分别分配给df_id
和df_measured
。输入这些向量很容易,缩短melt
...
df.m <- melt(df, id.vars = df_id, measure.vars = df_measured)
...但我不知道如何使用相同的方法在formula =
中输入dcast
参数来指定我的id变量,因为它要求输入指向数字位置列。
我是否必须创建一个类似于df_id
的数字位置向量,并且如果我的输入列按顺序更改,则可能会破坏我的程序的功能,或者我可以通过名称引用它们并以某种方式仍然可以使其工作在formula =
参数中?谢谢。
答案 0 :(得分:7)
您可以使用as.formula
来构建公式。
以下是一个例子:
library(reshape2)
## Example from `melt.data.frame`
names(airquality) <- tolower(names(airquality))
df_id <- c("month", "day")
aq <- melt(airquality, id = df_id)
## Constructing the formula
f <- as.formula(paste(paste(df_id, collapse = " + "), "~ variable"))
## Applying it....
dcast(aq, f, value.var = "value", fun.aggregate = mean)
答案 1 :(得分:0)
从Tidyverse软件包glue中导出的函数 glue()比使用 paste()更容易构建公式。这是 glue()的作用:
a <- 1
b <- 2
glue( "{a} + {b} = {a+b}." )
返回字符串
1 + 2 = 3.
因此, glue()逐字接受其参数,但用大括号代替名称和其他表达式。有关完整的规范,请参见上面的链接: glue()还有其他参数,包括更多的字符串,提供可在其中查找变量的环境的参数以及将大括号更改为其他参数的两个参数。定界符。就 dcast()而言,它避免了必须与 paste()一起使用的多余引号和逗号。这是一个使用表的示例:
install.packages( "glue" )
library( glue )
library( data.table )
dt <- data.table( c1 = c( 1 , 1 , 1 , 2 , 2 , 2 )
, c2 = c( "A", "B", "C", "A1", "B1", "C1" )
, c3 = c( 1 , 2 , 3 , 1 , 2 , 3 )
)
f1 <- function( d, col_name1, col_name2, col_name3 ) {
dcast( d, glue( "{col_name1} ~ {col_name3}" ), value.var = col_name2 )
}
f1( dt, "c1", "c2", "c3" )
这是它的输出(在R 3.6.3上):
> f1( dt, "c1", "c2", "c3" )
c1 1 2 3
1: 1 A B C
2: 2 A1 B1 C1