我正在尝试弄清楚如何连接2个数据表并更新第一个数据表,但应用了过滤器。
DT<-data.table(a=rep(1:3,3),b=seq(1:9))
DT
a b
1: 1 1
2: 2 2
3: 3 3
4: 1 4
5: 2 5
6: 3 6
7: 1 7
8: 2 8
9: 3 9
DT2 <- data.table(b=seq(1:9), c=rep(10,9))
> DT2
b c
1: 1 10
2: 2 10
3: 3 10
4: 4 10
5: 5 10
6: 6 10
7: 7 10
8: 8 10
9: 9 10
我可以像这样做基本的等值连接
DT[DT2, on=c(b="b")]
但我想在逻辑上做的是这个
DT[a==3,DT2, on=c(b="b")]
但是我收到以下错误
Error in `[.data.table`(DT, a == 3, DT2, on = c(b = "b")) :
logical error. i is not a data.table, but 'on' argument is provided.
我可以反转连接的顺序并应用过滤器......
DT2[DT[a==3,], on=c(b="b")]
b a
1: 3 3
2: 6 3
3: 9 3
哪个给出了正确的行,但列顺序不正确。除此之外,我想用c更新DT,但仅限于我在DT中过滤的行,并且满足连接。
如果这是SQL,我会使用带有子查询的更新,如下所示:
UPDATE
DT
set
c = (select c from DT2 where DT2.b = DT.B)
WHERE
DT.a=3
我似乎是在使用数据表语法圈子 - 有人能指出我正确的方向吗?
干杯
大卫
答案 0 :(得分:2)
您可以在dummy
中创建a
变量DT2
,同时加入 a 和 b 列,然后更新:
DT[DT2[, c(a = 3, .SD)], c := i.c, on = c("a", "b")]
DT
# a b c
#1: 1 1 NA
#2: 2 2 NA
#3: 3 3 10
#4: 1 4 NA
#5: 2 5 NA
#6: 3 6 10
#7: 1 7 NA
#8: 2 8 NA
#9: 3 9 10
答案 1 :(得分:2)
无需制作虚拟变量的另一个选项是:
#!/bin/bash
echo -n "Output to $2 "
# set counter
count=1
# zap output file
> $2
# Loop
while [ $count -le $1 ]
do
# generate some random text
randomnumber=`od -A n -t d -N 1 /dev/urandom`
randomtext=`cat /dev/urandom | tr -cd "[:alnum:]" | head -c $randomnumber`
# generate a random number
randomnumber=`od -A n -t d -N 1 /dev/urandom`
# output to file
echo "$count,$randomtext,$randomnumber" | sed -e "s: *::g" >> $2
# increment counter
count=$(($count + 1))
if [ $(($count % 500)) -eq 0 ]
then
echo -n "." fi
done
echo " Output complete"