我有一个包含日期和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,我可以在get("column_name_1")
中使用myfun
来引用该列吗?
更新 不确定如何形成这个更好的
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
答案 0 :(得分:3)
使用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
可能更聪明。
如果我有一个可重复的例子,我可以测试一下。