首页 > 解决方案 > 使用 SQL 样式的 INSERT 创建逐行数据框以提高易读性

问题描述

我在脚本中有一些参考表,其中一些值偶尔会手动更新。

使用通常的按列定义,在较大的表中识别要更改的正确索引可能会变得很麻烦:例如,在每列中查找要更改的第 15 个值。

虽然我知道这些可以在外部定义(例如),但我想知道它们是否可以更容易地直接在脚本中定义,以便为其他用户提供最大的可见性。


使用按列data.frame创建的简短示例:

data.frame(id = 1:3, 
           start = as.Date(c("2018-01-01", "2018-03-02", "2018-05-14")), 
           end = c(as.Date("2018-06-30"), Sys.Date(), Sys.Date()))

并使用按行创建 data.frame 仍然需要在每个显式变量名data.frame(否则列名可能不匹配rbind):

rbind(
  data.frame(id = 1, start = as.Date("2018-01-01"), end = as.Date("2018-06-30")),
  data.frame(id = 2, start = as.Date("2018-03-02"), end = Sys.Date()),
  data.frame(id = 3, start = as.Date("2018-05-14"), end = Sys.Date())
)

中实现这一点(我认为最清晰易读):

CREATE TABLE test (
  id int,
  start_date date,
  end_date date
);

INSERT INTO test
VALUES (1, '2018-01-01', '2018-06-30'),
       (2, '2018-03-02', SYSDATE),
       (3, '2018-05-14', SYSDATE);

我也很想知道这是否是一种不好的做法,以及将每个参考表存储在 CSV 中是否是最好的方法。

标签: sqlrdataframe

解决方案


1)sqldf包你可以这样做:

library(sqldf)

SYSDATE <- format(Sys.Date())
fn$sqldf("with test(id, start_date, end_date) as 
  (
     values
       (1, '2018-01-01', '2018-06-30'),
       (2, '2018-03-02', '$SYSDATE'),
       (3, '2018-05-14', '$SYSDATE')
  )
  select * from test")

2) tibble 包另一种可能是:

library(tibble)

SYSDATE <- format(Sys.Date())
test <- tribble(
  ~id, ~start_date, ~end_date,
  1, '2018-01-01', '2018-06-30',
  2, '2018-03-02', SYSDATE,
  3, '2018-05-14', SYSDATE)

3) Base R仅使用 base R 我们可以做到:

Lines <- "
id start_date end_date  
1 2018-01-01 2018-06-30
2 2018-03-02 2019-01-03
3 2018-05-14 2019-01-03
"
read.table(text = Lines, header = TRUE, as.is = TRUE)

推荐阅读