Match()和data.table的列的动态选择

时间:2017-12-19 10:22:36

标签: r data.table

我正在尝试使用<fmt:setLocale value='en_US' /> <% response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. response.setHeader("Pragma","no-cache"); //HTTP 1.0 response.setDateHeader ("Expires", 0); //prevents caching at the proxy server TransactionDO txnDO = (TransactionDO) session.getAttribute("txnDetails"); System.out.println("Txn no : "+txnDO.txnNo()); // Here i get 1001 second time %> <fmt:bundle basename="applicationresources"> <div ng-controller="txnController" ng-init="GetTxnResponse()" > --- --- </div> </fmt:bundle> 函数从data.table self.GetTxnResponse = function() { if (txnStatus == '00') { $http.get(CONTEXT_PATH + '/getResponseDetails').success(function(data) { // Here i get 1000 from data second time } } 动态选择列时应用过滤器并将其与另一个data.table @RequestMapping(value="/getResponseDetails", method=RequestMethod.GET) public @ResponseBody TransactionDO getResponseDetails(HttpServletRequest httpRequest){ TransactionDO txnDO = null; txnDO = (TransactionDO) httpRequest.getSession().getAttribute("txnDetails"); return txnDO; } 的列匹配。它不起作用,大概是因为当从data.table动态选择一列时,输出又是data.table而不是vector.

一个例子:

match()

这有效:

DT1

这(我需要的)不起作用:

DT2

只有当col1作为data.table的col1 = c(1, 3, 1, 3, 2, 2) col2 = c("Europe", "Europe", "Europe", "Europe", "Asia", "Asia") DT1 = data.table(col1, col2) col3 = 1:3 col4 = c( "carrot", "apple", "tomato") DT2 = data.table(col3, col4) 中的变量输入时,结果才是向量。这可能是原因吗?说明我的意思:

> match(DT1[col2 == "Europe", col1], DT2[, col3])
[1] 1 3 1 3

我认为> columnName = "col1" > match(DT1[col2 == "Europe", columnName, with = FALSE], DT2[, col3]) [1] NA 会自动处理这个问题,因为它的帮助文件是:

&#34;将因子,原始向量和列表转换为字符向量,然后将x和表强制转换为公共类型(R&#39的排序中的后两种类型,逻辑&lt; ;匹配前的整数&lt; numeric&lt; complex&lt; character)如果不可比较的长度为正,则会强制使用普通类型。&#34;

2 个答案:

答案 0 :(得分:1)

在不使用data.table时似乎有效,我认为在使用col1时应该小心,因为向量col1与data.frame或数据列之间存在混淆。表

DT1 = data.frame(col1=c(1, 3, 1, 3, 2, 2), col2=c("Europe", "Europe", "Europe", "Europe", "Asia", "Asia"))
DT2 = data.frame(col3 = 1:3, col4 = c( "carrot", "apple", "tomato"))

match(DT1[DT1$col2 == "Europe", "col1"], DT2[, "col3"])

columnName = "col1"
match(DT1[DT1$col2 == "Europe", columnName], DT2[, "col3"])

答案 1 :(得分:0)

@docendodiscimus为数据表提供了一个解决方案:答案您可以尝试用[[,即匹配(DT1 [col2 ==&#34; Europe&#34;] [[columnName]],DT2 [进行子集化, col3])