【问题标题】:How to use a character vector of column names in the formula argument of dcast (reshape2)如何在 dcast (reshape2) 的公式参数中使用列名的字符向量
【发布时间】:2015-02-12 18:08:00
【问题描述】:

假设我有一个数据框df,其中包含数十个识别变量(列中)和只有几个测量变量(也在列中)。

为避免重复键入每个参数的所有变量,我将识别和测量的df 列的名称分别分配给df_iddf_measured。输入这些向量很容易缩短melt 的参数输入...

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

...但是我不知道如何使用相同的方法在dcast 中输入formula = 参数来指定我的id 变量,因为它要求输入指向列的数字位置。

如果我的输入列按顺序更改,我是否必须制作一个类似于df_id 的数字位置向量,并冒着破坏程序功能的风险,或者我可以按名称引用它们,并且以某种方式仍然可以在formula = 参数?谢谢。

【问题讨论】:

  • “它要求输入指向数字位置”是什么意思?你能提供一个你想要达到的目标的样本吗?
  • 将字符向量转换为公式很容易,但我不明白您要做什么。

标签: r reshape2


【解决方案1】:

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

【讨论】:

  • 我仍然对 3 年内最优雅的解决方案感到惊讶......
  • 见下文!使用 Tidyverse glue() 函数,可以避免 paste() 中逗号和引号的泛滥。
【解决方案2】:

从 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多