2016-04-13 33 views
1

我希望以编程方式创建的变量名,如数组内的功能:如何通过可选参数do.call

desired_output <- c("first_purchase_date","last_purchase_date","largest_purchase_date", 
        "first_purchase_amount","last_purchase_amount","largest_purchase_amount") 

我相信我可以用do.call做到这一点,建立在这样的:

> do.call(paste, expand.grid(c("first","last","largest"),c("date","amount"))) 
[1] "first date"  "last date"  "largest date" "first amount" "last amount" "largest amount" 

但是我不能完全弄清楚如何在do.call范围内将sep="_purchase_"参数传递给paste。在?do.call我读了

args是参数的函数调用列表argsnames 属性给出参数名称。

试图将这一,我曾尝试:

df <- expand.grid(c("first","last","largest"), 
        c("date","amount"), 
        stringsAsFactors = FALSE) 

do.call(paste, args = list(...=df, sep="_purchase_")) 
# does not return desired output, but instead: 
# [1] "c(\"first\", \"last\", \"largest\", \"first\", \"last\", \"largest\")" 
# [2] "c(\"date\", \"date\", \"date\", \"amount\", \"amount\", \"amount\")" 

什么是产生通过do.calldesired_output正确的方法是什么?

+0

我想你想'do.call(paste,c(df,sep =“_ purchase _”))''。 – eipi10

+0

另外,我知道这是有效的:''mapply(paste,df $ Var1,df $ Var2,MoreArgs = list(sep =“_ purchase _”))' – C8H10N4O2

+0

@ eipi10工作 - 如果你把它写成答案,我会接受 – C8H10N4O2

回答

2

你可以做do.call(paste, c(df, sep="_purchase_")),但也许apply(df, 1, paste, collapse="_purchase_")更直接。

+0

我认为比较'str(c(df,sep =“_ purchase _”))和'str(list(df,sep =“_ purchase_”)是有帮助的。 )'。两者都是列表,但前者处于paste()所期望的“扁平”结构中,而不是后者产生的嵌套结构。 – C8H10N4O2