【问题标题】:transform data frame string variable names转换数据框字符串变量名
【发布时间】:2011-12-05 20:51:38
【问题描述】:

我有一个包含日期和 ID 的数据框。我需要根据每个日期向此数据框添加多列。我使用ddply 这样做如下:

ddply(df, "dt", transform, new_column1 = myfun(column_name_1))

但是,我有一堆列名,想添加多个新列。有没有办法可以传递一个字符串来转换而不是 new_column1?例如我试过:

ddply(df, "dt", transform, get("some_column_name")=myfun(column_name_1))

但这不起作用。另外,如果我将column_name_1 作为字符串传递给myfun,我可以在myfun 中使用get("column_name_1") 来引用该列吗?

更新: 不知道如何更好地格式化这个

input:
id    date    val
id1   d1      1
id2   d1      2
id3   d1      3
id4   d1      4
id1   d2      10
id2   d2      20
id3   d2      30
id4   d2      40

out(例如 2 个桶)

id    date    val     bucket
id1   d1      1         1
id2   d1      2         1
id3   d1      3         2
id4   d1      4         2
id1   d2      10        1
id2   d2      20        1
id3   d2      30        2
id4   d2      40        2

【问题讨论】:

  • 仅供参考,要创建代码块,只需将块中的行缩进四个空格。 (一般来说,更多格式规则请参见编辑框右上角的?)。

标签: r get transform dataframe plyr


【解决方案1】:

transform 做这件事很巧妙,但为什么不做一些更基本的事情,比如

tmpf <- function(x) {
   x[[new_column_name_1]] <- myfun(x[[column_name_1]])
   x[[new_column_name_2]] <- myfun(x[[column_name_2]])
   ...
   x
}
ddply(df,"dt",tmpf)

或者你可以有一个列名的向量来修改,或者即时修改:

tmpf <- function(x,cols=c("column_name_1","column_name_2")) {
   newcols <- paste("new",cols,sep="_")
   for (i in seq_along(cols)) {
      x[[newcols[i]]] <- myfun(x[[cols[i]]])
   }
}

在适当的环境中使用assign 可能会更聪明。

如果我有一个可重现的示例,我可以对此进行测试。

【讨论】:

  • 是的,这就是我目前所做的。我试图按照您的建议对 assign 做一些事情,但无法让事情在语法上起作用。不过,您的回答很好,谢谢!
  • 不明白为什么需要ddply - 你对每个组都做同样的事情!另见plyr::rename
  • 也许myfun 类似于function(x) x/mean(x),所以我们必须逐组转换位,而不是一次性转换。 (一个可重复的例子可以解决其中一些问题......)
  • 我刚刚更新了我的问题。基本思想是我有一堆日期,对于每个日期我都有一堆 id,我想按每个日期的值对这些 id 进行存储(因此每个日期都有一组存储桶 1...N)。如果有比 ddply 更有效的方法,请告诉我。
  • 这个解决方案的问题是我不能从我的函数中修改数据框,因为 R 通过值传递所有内容;如果存在,则在 R 中找不到如何通过引用传递
猜你喜欢
  • 2011-08-27
  • 2010-12-04
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多