r 结合两个不同的数据帧和时间戳
r combine two dataframes not the same and with timestamps
我是 R 的新手,正在尝试将一些代码从 SAS 更改为 R,但我被困在了一部分上。我目前想不出可以 post 代表我的问题的示例数据集。
Dataframe name1 有 5 列和 483 行。
Dataframe name2 有 27 列和超过 30000 行。
我目前在 SAS 中有这个:
proc sql;
create table name_c as
select a.*, b.*
from work.name1 a inner join work.name2 b
on a.name = b.name
where b.start_time <= a.p_start_time:
quit;
我尝试使用 sqldf
name_c <- sqldf("select a.*, b.* from name1 a inner join name2 b on
a.name = b.name
where b.start_time <= a.p_start_time")
但收到错误消息:
rsqlite_send_query(conn@ptr, 语句) 错误:
table name2 没有名为的列
另外: 警告信息:
在 field_types[] <- field_types[名称(数据)] 中:
要替换的项目数不是替换长度的倍数
我希望得到的结果是所有列,但按 sqldf 代码中提到的时间戳过滤。
我对 SAS 生疏了,但是(据我了解)您应该能够使用 dplyr 执行 inner_join 然后过滤。下面是一个玩具示例:
library(dplyr)
Name <- c(1,1,1,1,2,2,2,2,3,3,3,3)
Year <- c(2006,2007,2008,2009,2006,2007,2008,2009,2006,2007,2008,2009)
Qtr.1 <- as.numeric(c(15,12,22,10,12,16,13,23,11,13,17,14))
Qtr.2 <- as.numeric(c(14,32,62,40,72,26,43,53,14,53,67,17))
Qtr.3 <- as.numeric(c(55,52,52,50,52,56,53,53,51,15,15,54))
Qtr.4 <- as.numeric(c(65,72,52,40,52,66,63,24,51,63,57,84))
DF <- data.frame(Name,Year,Qtr.1,Qtr.2,Qtr.3,Qtr.4)
Name2 <- c(1,1,1,1,2,2,5,2,9,3,7,3)
Year2 <- c(2016,2034,2008,2009,2034,2007,2008,2009,2006,2007,2008,2009)
Qtr.1.2 <- as.numeric(c(15,12,22,10,12,16,13,23,11,13,17,14))
Qtr.2.2 <- as.numeric(c(14,32,62,40,72,26,43,53,14,53,67,17))
Qtr.3.2 <- as.numeric(c(55,52,52,50,52,56,53,53,51,15,15,54))
Qtr.4.2 <- as.numeric(c(65,72,52,40,52,66,63,34,51,63,57,84))
DF2 <- data.frame(Name2,Year2,Qtr.1.2,Qtr.2.2,Qtr.3.2,Qtr.4.2)
#using dplyr's inner_join + filter fuctions
x <- inner_join(DF, DF2 , by = c("Name" = "Name2"))
x <- x %>% filter(Year <= Year2)
x
# A tibble: 31 x 11
Name Year Qtr.1 Qtr.2 Qtr.3 Qtr.4 Year2
1 1 2006 15 14 55 65 2016
.....
我是 R 的新手,正在尝试将一些代码从 SAS 更改为 R,但我被困在了一部分上。我目前想不出可以 post 代表我的问题的示例数据集。
Dataframe name1 有 5 列和 483 行。
Dataframe name2 有 27 列和超过 30000 行。
我目前在 SAS 中有这个:
proc sql;
create table name_c as
select a.*, b.*
from work.name1 a inner join work.name2 b
on a.name = b.name
where b.start_time <= a.p_start_time:
quit;
我尝试使用 sqldf
name_c <- sqldf("select a.*, b.* from name1 a inner join name2 b on
a.name = b.name
where b.start_time <= a.p_start_time")
但收到错误消息: rsqlite_send_query(conn@ptr, 语句) 错误: table name2 没有名为的列 另外: 警告信息: 在 field_types[] <- field_types[名称(数据)] 中: 要替换的项目数不是替换长度的倍数
我希望得到的结果是所有列,但按 sqldf 代码中提到的时间戳过滤。
我对 SAS 生疏了,但是(据我了解)您应该能够使用 dplyr 执行 inner_join 然后过滤。下面是一个玩具示例:
library(dplyr)
Name <- c(1,1,1,1,2,2,2,2,3,3,3,3)
Year <- c(2006,2007,2008,2009,2006,2007,2008,2009,2006,2007,2008,2009)
Qtr.1 <- as.numeric(c(15,12,22,10,12,16,13,23,11,13,17,14))
Qtr.2 <- as.numeric(c(14,32,62,40,72,26,43,53,14,53,67,17))
Qtr.3 <- as.numeric(c(55,52,52,50,52,56,53,53,51,15,15,54))
Qtr.4 <- as.numeric(c(65,72,52,40,52,66,63,24,51,63,57,84))
DF <- data.frame(Name,Year,Qtr.1,Qtr.2,Qtr.3,Qtr.4)
Name2 <- c(1,1,1,1,2,2,5,2,9,3,7,3)
Year2 <- c(2016,2034,2008,2009,2034,2007,2008,2009,2006,2007,2008,2009)
Qtr.1.2 <- as.numeric(c(15,12,22,10,12,16,13,23,11,13,17,14))
Qtr.2.2 <- as.numeric(c(14,32,62,40,72,26,43,53,14,53,67,17))
Qtr.3.2 <- as.numeric(c(55,52,52,50,52,56,53,53,51,15,15,54))
Qtr.4.2 <- as.numeric(c(65,72,52,40,52,66,63,34,51,63,57,84))
DF2 <- data.frame(Name2,Year2,Qtr.1.2,Qtr.2.2,Qtr.3.2,Qtr.4.2)
#using dplyr's inner_join + filter fuctions
x <- inner_join(DF, DF2 , by = c("Name" = "Name2"))
x <- x %>% filter(Year <= Year2)
x
# A tibble: 31 x 11
Name Year Qtr.1 Qtr.2 Qtr.3 Qtr.4 Year2
1 1 2006 15 14 55 65 2016
.....