【问题标题】:ddply - spaces in variable name contained in an objectddply - 对象中包含的变量名中的空格
【发布时间】:2013-03-14 20:34:06
【问题描述】:

有没有办法将命名变量和包含带有空格的变量名的对象传递给 ddply?这是我的意思的一个例子:

> library(plyr)
> dat <- data.frame(id1=rep(c("A","B"),8),id2=rep(c("C","D","E","F"),4),x=rnorm(16))
> vname <- "id2"
#works without spaces
> ddply(dat,c("id1",vname),colwise(sum))
  id1 id2          x
1   A   C -1.1215505
2   A   E -1.4507586
3   B   D  1.5064013
4   B   F -0.5428153
> vname <- "id 2"
> names(dat)[2] <- vname
#breaks with spaces
> ddply(dat,c("id1",vname),colwise(sum))
Error in parse(text = x) : <text>:1:4: unexpected numeric constant
1: id 2
      ^
#backticks work when manually entering the name
> ddply(dat,c("id1","`id 2`"),colwise(sum))
  id1 id 2          x
1   A    C -1.1215505
2   A    E -1.4507586
3   B    D  1.5064013
4   B    F -0.5428153
#backticks don't work when pointing to object containing name
> ddply(dat,c("id1",`vname`),colwise(sum))
Error in parse(text = x) : <text>:1:4: unexpected numeric constant
1: id 2
      ^

【问题讨论】:

  • 不这样做会容易得多,而是使用格式正确的列名。
  • 同意,但在这种特殊情况下这实际上会很麻烦。我可以通过临时调整名称来找到解决方法,但我不希望有一堆条件语句来这样做。

标签: r plyr reshape2


【解决方案1】:

你可以这样做,但它看起来很丑:

 ddply(dat,c("id1",paste("`",vname,"`",sep='')),colwise(sum))
  id1 id 2          x
1   A    C  1.3719443
2   A    E -0.3264330
3   B    D -0.3231757
4   B    F -0.6807928

如评论中所说,使用格式正确的名称。

【讨论】:

  • 它很丑,但在这个确切的上下文中并不像替代品那么丑。谢谢!
  • @user2167315 我真的很好奇,不让你重命名列的上下文是什么? (当我说丑陋时,我是在开玩笑,所以不要冒犯)。
  • 它们可以重命名,但这样做会很烦人。这是一个交互式报告界面,需要漂亮的标题/标签/等......所以变量要么需要在最后以这种方式命名。因为有很多不同的变量/图表/表格组合更改名称将需要一长串条件语句来说明如何更改它们以及何时更改。
  • @user2167315 通常是变量的名称,如果不显示的话。想象一下,您需要用另一种语言编写报告?或按部门/用户更改变量名称......无论我认为你明白我的意思......
【解决方案2】:

你不能指望非语法名称可以很好地与所有函数和包一起使用。

但是,他们将使用 data.table

请改用data.tablecolwise(fun) 的等价物是 lapply(.SD, fun)

  dat <- data.frame(id1=rep(c("A","B"),8),
          "id 2"=rep(c("C","D","E","F"),4),x=rnorm(16), check.names= FALSE)

  library(data.table)
  DT <- data.table(dat)
  vname <- "id 2"
  DT[,lapply(.SD, sum) , by = c('id1',vname)]

如果你想坚持plyr

然后

as.character(as.name(vname))

将创建字符向量

您可以创建一个执行此操作的函数

charN <- function(x) as.character(as.name(x))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2019-03-17
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多