我在data.frame中获得了投影数据(通过将所有德国气象站数据投影到德国shapefile得到)。但是,在我的第一步中,我想要提取begin date
中end date
和01.01.1981 ~ 31.12.2014
属性的所有行。所以我确实在原始的合并data.frame上采用了子集,但不知道操作失败的原因。我在飞行中以csv
格式分享了原始数据(data is here)。基本上,我将保留所有日期间隔为01.01.1981 ~ 31.12.2014
的实例(我需要分析德国最近35年的天气数据)。我很确定我的代码可以处理我的数据,但最后仍然失败了。快速解决方案?我怎样才能在R中实现这一点? dplyr
,data.table
可以为此提供帮助吗?还有什么想法?感谢
以下是数据的外观(原始数据源即时发布):
Stationsname Stations_ID ID__Index Station.Identification Width Length Station_Height River_Basin Federal_state
1 Aach 1 KL 02783 47.8410 8.8490 478 NA BW
2 Aach 1 RR 70191 47.8410 8.8490 478 NA BW
3 Aach/Hegau 10771 PE 10771 47.8500 8.8500 480 NA BW
4 Aachen 3 EB 02205 50.7827 6.0941 202 803100 NW
5 Aachen 3 FF 02205 50.7827 6.0941 202 803100 NW
6 Aachen 3 KL 02205 50.7827 6.0941 202 803100 NW
Begin End ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 HASC_2 CCN_2 CCA_2
1 01.01.1937 30.06.1986 86 DEU Germany 1 Baden-Württemberg 22 Konstanz DE.BW.KN 0 8335
2 01.01.1912 30.06.1986 86 DEU Germany 1 Baden-Württemberg 22 Konstanz DE.BW.KN 0 8335
3 86 DEU Germany 1 Baden-Württemberg 22 Konstanz DE.BW.KN 0 8335
4 01.01.1951 31.03.2011 86 DEU Germany 10 Nordrhein-Westfalen 290 Städteregion Aachen DE.NW.AC 0 5334
5 01.01.1937 31.03.2011 86 DEU Germany 10 Nordrhein-Westfalen 290 Städteregion Aachen DE.NW.AC 0 5334
6 01.01.1891 31.03.2011 86 DEU Germany 10 Nordrhein-Westfalen 290 Städteregion Aachen DE.NW.AC 0 5334
TYPE_2 ENGTYPE_2 NL_NAME_2 VARNAME_2
1 Landkreis District NA
2 Landkreis District NA
3 Landkreis District NA
4 Kreis District NA
5 Kreis District NA
6 Kreis District NA
我在下面阅读了实验数据集:
joinedData <- read.csv(file = "~/joinedLayer_attrTabl.csv",sep = "," ,header = TRUE)
head(as.data.frame(joinedData)); tail(as.data.frame(joinedData))
这是我最初的试用版:
dateInterval <- function(x,y){joinedData[joinedData$Begin >= x
& joinedData$End <= y,]}
DATE1 <- as.Date("01-01-1981")
DATE2 <- as.Date("31-12-2014")
res <- dateInterval(DATE1,DATE2)
以下是Rstudio引发的错误:
> dateInterval <- function(x,y){joinedData[joinedData$Begin > x & joinedData$End < y, ]}
>
> DATE1 <- as.Date("01-01-1981")
> DATE2 <- as.Date("31-12-2014")
> res <- dateInterval(DATE1,DATE2)
Warning messages:
1: In `[.data.frame`(joinedData, joinedData$Begin > x & joinedData$End < :
Incompatible methods ("Ops.factor", "Ops.Date") for ">"
2: In `[.data.frame`(joinedData, joinedData$Begin > x & joinedData$End < :
Incompatible methods ("Ops.factor", "Ops.Date") for "<"
我也在下面尝试过这个:
joinedData[joinedData$Begin & joinedData$End %between% c("01.01.1981", "31.12.2014"),]
仍然,我没有得到我预期的结果。为什么这个错误发生在我身上?有什么想法吗?
输出:
我将选择其开始和结束数据都在指定日期间隔内的所有行。有什么办法解决这个问题吗?我怎样才能做到这一点?
答案 0 :(得分:1)
我可以在OP的代码中看到几个问题。
问题#1 :as.Date
预期的默认格式为"%Y-%m-%d" or "%Y/%m/%d"
。但代码中使用的字符(Begin
,End
列)的格式为%d.%m.%Y
或%s-%m-%Y
。因此,函数format
中的默认as.Date()
将不起作用。 format
参数应专门提供给as.Date()
函数。
创建DATE1
和DATE2
的正确代码应为:
DATE1 <- as.Date("01-01-1981", format = "%d-%m-%Y")
DATE2 <- as.Date("31-12-2014", , format = "%d-%m-%Y")
问题#2 :在尝试过滤操作之前,数据框的Begin
和End
列也应更改为as.Date
格式。
这两列的格式可以更改为:
joinedData$Begin = as.Date(joinedData$Begin, format = "%d.%m.%Y")
joinedData$End= as.Date(joinedData$End, format = "%d.%m.%Y")
现在,OP'2初始方法应该有效。
注意:我个人更喜欢使用as.POSIXlt
而不是as.Date