如何通过R中的索引从数据表中提取列?

时间:2018-03-12 02:29:47

标签: r data.table indices

我想从名为dt

的数据表中提取第4,第5和第6列

以下方法有效:

    dt[, c(4,5,6)]

但以下情况并非如此:

    a = c(4,5,6)
    dt[, a]

事实上,第二种方法给了我一个结果:

    4 5 6

有人能告诉我为什么会这样吗?这两种方法看起来与我相同。

2 个答案:

答案 0 :(得分:3)

我们可以在对象' a'之前使用双点($insert = $MysqlConn->prepare($tempInsert); while($row2 = $place->fetch(PDO::FETCH_ASSOC)){ print_r($row2); $values = [ ":DEALER" => $row2["DEALER"], ":SHIPDATE" => $row2["SHIPDATE"], ":QUANTITY" => $row2["QUANTITY"], ":INVOICE" => $row2["INVOICE"], ":FRAME" => $row2["FRAME"], ":COVER" => $row2["COVER"], ":COLOR" => $row2["COLOR"], ]; try{ $insertRslt = $insert->execute($values); }catch(PDOException $ex){ echo "QUERY FAILED!!!: " . $ex->getMessage(); } } )。提取列

..

或另一个选项是dt[, ..a] # col4 col5 col6 #1: 4 5 6 #2: 5 6 7 #3: 6 7 8 #4: 7 8 9

with = FALSE

数据

dt[, a, with = FALSE]

答案 1 :(得分:1)

@ akrun的回答为您提供了正确的选择。如果您想知道为什么需要它,请参考以下更详细的说明:

data.table子集操作的工作方式,在大多数情况下,/../mingw32/bin/ld.exe: cannot open output file demo.exe: Permission denied collect2.exe: error: ld returned 1 exit status [Finished in 3.1s] 中没有jdt[i, j, by]的{​​{1}}表达式在数据表,并按原样返回,是否与括号外的数据表有任何关系。在1.9.8之前的版本中,您的第一个代码段:i计算为数字向量by,而不是第4,第5和第6列。这从data.table v1.9.8 (released November 2016)开始改变(向下滚动到v.1.9.8可能会破坏更改),因为人们不出所料地期望dt[,c(4, 5, 6)]给出第4和第5列。现在,如果j表达式是变量名称或数字,c(4, 5, 6)将自动设置为dt[,c(4, 5, 6)]。这有效地产生类似于子集化数据帧的行为(不完全相同,但相似)。

因此,您的第二个代码段(其中with评估为FALSE,而非使用dt[, a]对列进行子集化)实际上是默认值,第一个是特殊情况。< / p>

为了说明奇怪但标准的行为,请尝试:

a

无论你的a是什么,只要它是data.table,它就会评估为5 * 5单位矩阵