1
例如,假设我想构建一个用于分析客户事务的包。在一个漂亮的世界里,每一个交易数据集看起来像处理具有相同数据类型但列名不同的数据集的最佳实践
TransactionId CustomerId TransactionDate
1: 1 1 2017-01-01
2: 2 2 2017-01-15
3: 3 1 2017-05-20
4: 4 3 2017-06-11
然后,我可以做很好的功能,如
num_customers <- function(transactions){
length(unique(transactions$CustomerId))
}
在现实中,人们使用的列名会有所不同。 (例如,“CustomerId”,“CustomerID”和“cust_id”可能全部由不同的公司使用)。
我的问题是,我处理这个问题的最佳方法是什么?我计划在很大程度上依赖于data.table,所以我的直觉是做让用户我像
mytransactions <- data.table(
transaction_id = c(1L, 2L, 3L, 4L),
customer_id = c(1L, 2L, 1L, 3L),
transaction_date = as.Date(c("2017-01-01", "2017-01-15", "2017-05-20", "2017-06-11"))
)
setattr(
mytransactions,
name = "colmap",
value = c(TransactionID="transaction_id", CustomerID="customer_id", TransactionDate="transaction_date")
)
attributes(mytransactions)
其表的属性。然而,不幸的是,一旦使用的人提供他们的列名的映射因为他们的数据子集,这个属性被删除。
attributes(mytransactions[1:2])
编程时使用'data.frame'对象使用'transactions [[“CustomerId”]]'而不是'transactions $ CustomerId'。像这样,你可以让函数使用一个字符值作为参数。像'num_customers < - 函数(transactions,custid)'。 (顺便说一句,你的函数定义中有一个错字,它不是'''')。 –
@RuiBarradas谢谢,但我不认为这是一个包含许多函数的包的实际解决方案,特别是因为它需要用户输入每个单一功能的列名映射。这可能会使用户的代码不必要的冗长和重复。 – Ben
这是它的缺点,但它通常被认为是编程时最好的实践。建议'''操作符应该留给交互式使用而已。 –