我是R的新手,如果我的语言不准确,请原谅(并纠正)我。
我编写了一个程序来加载数据,创建一个列联表(使用xtabs),在其上运行一些外部函数,以及输出结果表。我在我的完整数据集上运行代码,并希望在我的数据子集上运行相同的代码。我已将代码作为函数包装起来,并希望能够传递子集的名称(SUBNAM)和子集表达式(SUBEXP) )作为函数调用中的参数,如:
HCACC <- function (SUBNAM, SUBEXP) {
CM.SUBNAM <- as.matrix(
xtabs(~HC_map+HC_obs, data=VVD
, drop.unused.levels=FALSE, sparse=TRUE
, subset=(SUBEXP)
) )
AKw.SUBNAM <- kw(CM.SUBNAM, wtHC)
USER.SUBNAM <- as.data.frame(AKw.SUBNAM$user.wa)
write.csv(HCACC.SUBNAM, file="HCACC.SUBNAM.csv", row.names=TRUE)
}
HCACC(2013, Year == 2013)
HCACC(JMDR, Observer == "JMDR")
(最后三行是我想要SUBNAM的例子,实际上有40个实例)
我想最终得到CM.2013,CM.JMDR等,而无需复制/粘贴&amp;重复查找/替换代码。
似乎必须有办法做到这一点,但我尝试它的方式不起作用,我的谷歌搜索没有改变任何东西(但我怀疑我可能一直在问错误的问题)。任何提示或指示将不胜感激。
*EDIT*
为了澄清,我对其他将子集名称和表达式传递给函数而不是作为参数的方法持开放态度。我只是希望能够在不同的子集上重复分析/代码,并相应地命名输出。感谢您的见解!
答案 0 :(得分:0)
首先,您的代码中似乎存在错误(拼写错误)。您创建了数据框USER.SUBNAM,但尝试写出不存在的HCACC.SUBNAM。此外,您的评论表明您希望文件名称为CM.2013和CM.JMDR,但您的代码似乎正在尝试HCACC.2013和HCACC.JMDR。
看起来您实际需要使用SUBNAM的唯一地方是输出文件名。函数中的所有变量都是临时变量,每次调用函数时都不需要使用不同的名称。所以相反,我认为你想要的东西是:
HCACC <- function (SUBNAM, SUBEXP) {
CM <- as.matrix(xtabs(~HC_map+HC_obs, data=VVD,
drop.unused.levels=FALSE, sparse=TRUE,
subset=(SUBEXP)
) )
AKw <- kw(CM, wtHC)
HCACC <- as.data.frame(AKw$user.wa)
write.csv(HCACC, file= paste("HCACC.", SUBNAM, ".csv", sep=""),
row.names=TRUE)
}
HCACC(2013, Year == 2013)
HCACC(JMDR, Observer == "JMDR")