Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果落在由R中另一个数据集中的两个变量定义的范围内,则从一个数据集中获取变量值_R_Date_Statistics_Dataset - Fatal编程技术网

如果落在由R中另一个数据集中的两个变量定义的范围内,则从一个数据集中获取变量值

如果落在由R中另一个数据集中的两个变量定义的范围内,则从一个数据集中获取变量值,r,date,statistics,dataset,R,Date,Statistics,Dataset,我有一个关于R中日期操纵的问题。我已经四处查看了好几天,但在网上找不到任何帮助。我有一个数据集,其中我有id和两个日期,另一个数据集有相同的id变量,日期和价格。例如: x=data.frame(id=c(“A”、“B”、“c”、“c”), 日期1=c(“2013年5月29日”、“2011年8月23日”、“2011年9月25日”、“2011年11月18日”), 日期2=c(“2013年7月10日”、“2011年10月4日”、“2011年11月10日”、“2011年12月15日”)) >x id

我有一个关于R中日期操纵的问题。我已经四处查看了好几天,但在网上找不到任何帮助。我有一个数据集,其中我有id和两个日期,另一个数据集有相同的id变量,日期和价格。例如:

x=data.frame(id=c(“A”、“B”、“c”、“c”),
日期1=c(“2013年5月29日”、“2011年8月23日”、“2011年9月25日”、“2011年11月18日”),
日期2=c(“2013年7月10日”、“2011年10月4日”、“2011年11月10日”、“2011年12月15日”))
>x
id date1 date2
1A 2013年5月29日2013年7月10日
2 B 2011年8月23日2011年10月4日
3 C 2011年9月25日2011年11月10日
4 C 2011年11月18日2011年12月15日
y=数据帧(id=c(“A”、“A”、“A”、“B”、“B”、“B”、“B”、“B”、“c”、“c”、“c”),
日期=c(“2013年2月21日”、“2013年6月19日”、“2013年7月31日”、“2011年10月7日”、“2012年1月16日”、“2012年7月10日”、“2012年9月20日”、“2012年11月29日”、“2014年8月15日”、“2011年9月27日”、“2012年1月27日”、“2012年3月9日”),
价格=c(126109111,14,13.8,14.1,14,14.4143102114116))
>y
id日期价格
1A 2013年2月21日126.0
2A 2013年6月19日109.0
3A 2013年7月31日111.0
4 B 2011年10月7日14.0
5 B 2012年1月16日13.8
6 B 2012年7月10日14.1
7 B 2012年9月20日14.0
8 B 2012年11月29日14.4
9 B 2014年8月15日143.0
10 C 2011年9月27日102.0
11 C 2012年1月27日114.0

12 C 2012年3月9日116.0
我将分两步来做这件事。首先,按id连接每个df(有关连接的更多详细信息,请参见),如下所示:

df <- merge(x, y, by = "id")

df这里是一个基于
data.table
包的出色
foverlaps
的解决方案

library(data.table)
## coerce characters to dates ( numeric) 
setDT(x)[,c("date1","date2"):=list(as.Date(date1,"%d/%m/%Y"),
                                   as.Date(date2,"%d/%m/%Y"))]
## and a dummy date since foverlaps looks for a start,end columns 
setDT(y)[,c("date1"):=as.Date(date,"%d/%m/%Y")][,date:=date1]
## y must be keyed
setkey(y,id,date,date1)
foverlaps(x,y,by.x=c("id","date1","date2"))[,
            list(id,i.date1,date2,date,price)]

  id    i.date1      date2       date price
1:  A 2013-05-29 2013-07-10 2013-06-19   109
2:  B 2011-08-23 2011-10-04       <NA>    NA
3:  C 2011-09-25 2011-11-10 2011-09-27   102
4:  C 2011-11-18 2011-12-15       <NA>    NA
库(data.table)
##强制字符为日期(数字)
setDT(x)[,c(“date1”,“date2”):=列表(截至日期(date1),%d/%m/%Y)),
截止日期(日期2,“%d/%m/%Y”))]
##还有一个虚拟日期,因为foverlaps查找开始列和结束列
setDT(y)[,c(“日期1”):=截止日期(日期,“%d/%m/%y”)][,日期:=日期1]
##必须键入y
设置键(y、id、日期、日期1)
foverlaps(x,y,by.x=c(“id”,“date1”,“date2”))[,,
列表(id、i.date1、date2、日期、价格)]
id i.date1日期2日期价格
1:A 2013-05-29 2013-07-10 2013-06-19 109
2:B 2011-08-232011-10-04NA
3:C 2011-09-25 2011-11-10 2011-09-27 102
4:C 2011-11-18 2011-12-15北美

PS:结果不完全相同,因为您的预期输出有错误。

或使用
lubridate
base R

m <- merge(x, y, by='id')
d_range <- m$date1 %--% m$date2
m2 <- m[m$date %within% d_range, ]
res <- merge(x, m2, by=c('id', 'date1', 'date2'), all.x=T)
数据

x = data.frame(id = c("A","B","C","C"), 
               date1 = c("29/05/2013", "23/08/2011", "25/09/2011",  "18/11/2011"),    
               date2 = c("10/07/2013", "04/10/2011", "10/11/2011",  "15/12/2011"))

y = data.frame(id = c("A","A","A","B","B","B","B","B","B","C","C","C"),
              date = c("21/02/2013",  "19/06/2013",  "31/07/2013",  "07/10/2011",   "16/01/2012",   "10/07/2012","20/09/2012",  "29/11/2012",       "15/08/2014",   "27/09/2011",   "27/01/2012",   "09/03/2012"),
              price = c(126,109,111,14,13.8,14.1,14,    14.4,143,102,114,116))

x[c('date1', 'date2')] <- lapply(x[c('date1', 'date2')], dmy)
y['date'] <- dmy(y[,'date'])
x=data.frame(id=c(“A”、“B”、“c”、“c”),
日期1=c(“2013年5月29日”、“2011年8月23日”、“2011年9月25日”、“2011年11月18日”),
日期2=c(“2013年7月10日”、“2011年10月4日”、“2011年11月10日”、“2011年12月15日”))
y=数据帧(id=c(“A”、“A”、“A”、“B”、“B”、“B”、“B”、“B”、“c”、“c”、“c”),
日期=c(“2013年2月21日”、“2013年6月19日”、“2013年7月31日”、“2011年10月7日”、“2012年1月16日”、“2012年7月10日”、“2012年9月20日”、“2012年11月29日”、“2014年8月15日”、“2011年9月27日”、“2012年1月27日”、“2012年3月9日”),
价格=c(126109111,14,13.8,14.1,14,14.4143102114116))
x[c('date1','date2')]另见:
m <- merge(x, y, by='id')
d_range <- m$date1 %--% m$date2
m2 <- m[m$date %within% d_range, ]
res <- merge(x, m2, by=c('id', 'date1', 'date2'), all.x=T)
  id      date1      date2       date price
1  A 2013-05-29 2013-07-10 2013-06-19   109
2  B 2011-08-23 2011-10-04       <NA>    NA
3  C 2011-09-25 2011-11-10 2011-09-27   102
4  C 2011-11-18 2011-12-15       <NA>    NA
x = data.frame(id = c("A","B","C","C"), 
               date1 = c("29/05/2013", "23/08/2011", "25/09/2011",  "18/11/2011"),    
               date2 = c("10/07/2013", "04/10/2011", "10/11/2011",  "15/12/2011"))

y = data.frame(id = c("A","A","A","B","B","B","B","B","B","C","C","C"),
              date = c("21/02/2013",  "19/06/2013",  "31/07/2013",  "07/10/2011",   "16/01/2012",   "10/07/2012","20/09/2012",  "29/11/2012",       "15/08/2014",   "27/09/2011",   "27/01/2012",   "09/03/2012"),
              price = c(126,109,111,14,13.8,14.1,14,    14.4,143,102,114,116))

x[c('date1', 'date2')] <- lapply(x[c('date1', 'date2')], dmy)
y['date'] <- dmy(y[,'date'])