ошибка обновления sqldf

У меня есть два набора данных, что-то вроде

Datset1

Index  Mac Date         Cons
1      35  1432425600   Nil
2      35  1431993600   Nil
3      35  1433894400   Nil
4      35  1433376000   Nil

 Dataset2

Index  Mac Start_Date  End_Date       Cons
1      35  1432339200  1432771200     D1
2      35  1433116800  1435017600     D2

Итак, все, что я ищу, - это результирующий набор из набора данных1, который соответствует столбцу Mac в наборе данных2 и [Dataset1.Date] должен быть между [Dataset2.Start_Date] и [Dataset.End_Date], чтобы получить столбец Cons. Так что в идеале мой результат должен выглядеть примерно так

Final Dataset
Index  Mac Date         Cons
1      35  1432425600   D1
2      35  1431993600   Nil
3      35  1433894400   D2
4      35  1433376000   D2

Я пытаюсь добиться этого в R при использовании sqldf. Для начала я использовал 1 простой код только на Mac.

sqldf2 <- sqldf("update dataset1
            set dataset1.Cons = dataset2.Cons
            FROM dataset1 INNER JOIN dataset2
            ON dataset1.Mac = dataset2.Mac") 

но это дало мне ошибку

Error in rsqlite_send_query(conn@ptr, statement) : near ".": syntax error

В дальнейшем я планирую использовать что-то вроде этого, что определенно неправильно, пожалуйста, помогите и с этим.

sqldf2 <- sqldf("update dataset1
            set dataset1.Cons = dataset2.Cons
            FROM dataset1 INNER JOIN dataset2
            ON dataset1.Mac = dataset2.Mac 
            AND (dataset1.Date > dataset2.Start_Date & dataset1.Date<dataset2.End_Date)")

Я ценю всю помощь!


person Manu Sharma    schedule 20.12.2016    source источник


Ответы (1)


Мы можем использовать левое соединение:

# dummy data*
dataset1 <- read.table(text = "
rn  Mac Date         Cons
1      35  1432425600   Nil
2      35  1431993600   Nil
3      35  1433894400   Nil
4      35  1433376000   Nil", header = TRUE)

dataset2 <- read.table(text = "
rn  Mac Start_Date  End_Date       Cons
1      35  1432339200  1432771200     D1
2      35  1433116800  1435017600     D2", header = TRUE)

library(sqldf)

sqldf("select a.rn, a.Mac, a.Date, b.Cons
       from dataset1 a
       left join dataset2 b
       on a.Mac = b.Mac and
          a.Date >= b.Start_Date and
          a.Date <= b.End_Date")

#   rn Mac       Date Cons
# 1  1  35 1432425600   D1
# 2  2  35 1431993600 <NA>
# 3  3  35 1433894400   D2
# 4  4  35 1433376000   D2

Примечание. Я изменил "Index" на "rn", иначе возникнет ошибка.

person zx8754    schedule 20.12.2016
comment
Спасибо, это полезно. Также укажите, какую ошибку я допустил при использовании обновления в sqldf, поскольку я поделился кодом. - person Manu Sharma; 20.12.2016
comment
@manusharma См. эту публикацию: SQLite не поддерживает JOIN в операторах UPDATE. - person zx8754; 20.12.2016