R数据表 - 加入但过滤更新

时间:2017-10-05 14:36:55

标签: r data.table

我正在尝试弄清楚如何连接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

我似乎是在使用数据表语法圈子 - 有人能指出我正确的方向吗?

干杯

大卫

2 个答案:

答案 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"