如何在dcast的公式参数中使用列名的字符向量(reshape2)

t3psigkw  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(88)

假设我有一个数据框df,其中有几十个标识变量(列),只有几个测量变量(也是列)。
为了避免重复输入每个参数的所有变量,我将标识列和测量列的名称分别分配给df_iddf_measured。很容易输入这些向量来缩短melt的参数输入…

df.m  <- melt(df, id.vars = df_id, measure.vars = df_measured)

...但我不知道如何使用相同的方法在dcast中输入formula =参数来指定id变量,因为它要求输入指向列的数字位置。
如果我的输入列的顺序发生了变化,我是否必须创建一个类似于df_id的数字位置向量,并冒着破坏程序功能的风险,或者我可以通过名称引用它们,并以某种方式在formula =参数中仍然可以工作?谢谢

wz3gfoph

wz3gfoph1#

您可以使用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)
blmhpbnm

blmhpbnm2#

从Tidyverse包glue导出的函数 glue() 使公式比 paste() 更容易构建。下面是 glue() 的作用:

a <- 1
b <- 2
glue( "{a} + {b} = {a+b}." )

返回字符串
因此,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
wlwcrazw

wlwcrazw3#

对于使用base R的人来说,sprintf()glue::glue()相比是很好的:

vars_to_use <- c("Petal.Length", "Sepal.Length")

as.formula(sprintf("Species ~ %s", 
                   paste(vars_to_use, collapse = " + ")))

## Species ~ Petal.Length + Sepal.Length

作为奖励,如果您可以使用sprintf()而不是使用paste(),您将获得性能改进,因为它是在C中实现的。

相关问题