我想从名为dt
的数据表中提取第4,第5和第6列以下方法有效:
dt[, c(4,5,6)]
但以下情况并非如此:
a = c(4,5,6)
dt[, a]
事实上,第二种方法给了我一个结果:
4 5 6
有人能告诉我为什么会这样吗?这两种方法看起来与我相同。
答案 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]
中没有j
或dt[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单位矩阵