如何在 R 中导入 ical .ics 文件
How to import ical .ics file in R
我想将 .ics file 导入到 R 中,但是,当我尝试这样做时...
sneak_cal <- read.delim("iCal-TribeEvents.ics", sep = ":", header=FALSE, stringsAsFactors = FALSE, strip.white = TRUE, na.strings = "")
...我最终也拆分了网站的字符串(属于X-ORIGINAL-URL
或UID
字段),这是不可取的
即https
和//www.kicksonfire.com
最终目标是将数据整理成一种整齐的格式,其中每一行代表一个 VEVENT
,我认为它可以由一个唯一的 UID
表示,而不会丢失任何信息(比如 URL)
是否有其他推荐的方法,例如预定义预期作为键的字段并将值或空 space 与该键匹配?由于 .ics
文件每次都有相同的预期字段,使用这些字段作为模板来读取数据似乎是有意义的,但我不知道该怎么做。
这是一个例子
x <- readLines("https://www.kicksonfire.com/releases/?ical=1&tribe_display=list", warn = FALSE)
stopifnot(!any(grepl("^\s+", x))) # disregarding value fields that have linefeeds for the sake of simplicity
keyval <- do.call(rbind, regmatches(x, regexpr(":", x, fixed = TRUE), invert = TRUE))
keyval <- keyval[which.max(keyval[,1]=="BEGIN" & keyval[,2]=="VEVENT"):tail(which(keyval[,1]=="END" & keyval[,2]=="VEVENT"), 1),]
keyval <- cbind.data.frame(keyval, id=cumsum(keyval[,1]=="BEGIN" & keyval[,2]=="VEVENT"))
df <- reshape(keyval, timevar="1", idvar="id", direction = "wide")
head(df[,c(3,4,9)])
# 2.DTSTART;VALUE=DATE 2.DTEND;VALUE=DATE 2.SUMMARY
# 1 20170422 20170423 Air Jordan 11 Low GS Blue Moon
# 14 20170422 20170423 Air Jordan 5 Premium Pure Platinum
# 27 20170427 20170428 Nike Air VaporMax Asphalt
# 40 20170427 20170428 Nike Air VaporMax Oreo
# 53 20170427 20170428 Nike WMNS Air VaporMax White Ice Blue
# 66 20170427 20170428 wings+horns x adidas NMD R2 Light Grey
现在可用的更简单、更强大的选项是 CRAN 上的 calendar
包(文档 here)。从 ICS 文件导入数据框只需要一行代码,创建新事件然后导出到新的 ICS 文件也很简单。
我想将 .ics file 导入到 R 中,但是,当我尝试这样做时...
sneak_cal <- read.delim("iCal-TribeEvents.ics", sep = ":", header=FALSE, stringsAsFactors = FALSE, strip.white = TRUE, na.strings = "")
...我最终也拆分了网站的字符串(属于X-ORIGINAL-URL
或UID
字段),这是不可取的
即https
和//www.kicksonfire.com
最终目标是将数据整理成一种整齐的格式,其中每一行代表一个 VEVENT
,我认为它可以由一个唯一的 UID
表示,而不会丢失任何信息(比如 URL)
是否有其他推荐的方法,例如预定义预期作为键的字段并将值或空 space 与该键匹配?由于 .ics
文件每次都有相同的预期字段,使用这些字段作为模板来读取数据似乎是有意义的,但我不知道该怎么做。
这是一个例子
x <- readLines("https://www.kicksonfire.com/releases/?ical=1&tribe_display=list", warn = FALSE)
stopifnot(!any(grepl("^\s+", x))) # disregarding value fields that have linefeeds for the sake of simplicity
keyval <- do.call(rbind, regmatches(x, regexpr(":", x, fixed = TRUE), invert = TRUE))
keyval <- keyval[which.max(keyval[,1]=="BEGIN" & keyval[,2]=="VEVENT"):tail(which(keyval[,1]=="END" & keyval[,2]=="VEVENT"), 1),]
keyval <- cbind.data.frame(keyval, id=cumsum(keyval[,1]=="BEGIN" & keyval[,2]=="VEVENT"))
df <- reshape(keyval, timevar="1", idvar="id", direction = "wide")
head(df[,c(3,4,9)])
# 2.DTSTART;VALUE=DATE 2.DTEND;VALUE=DATE 2.SUMMARY
# 1 20170422 20170423 Air Jordan 11 Low GS Blue Moon
# 14 20170422 20170423 Air Jordan 5 Premium Pure Platinum
# 27 20170427 20170428 Nike Air VaporMax Asphalt
# 40 20170427 20170428 Nike Air VaporMax Oreo
# 53 20170427 20170428 Nike WMNS Air VaporMax White Ice Blue
# 66 20170427 20170428 wings+horns x adidas NMD R2 Light Grey
现在可用的更简单、更强大的选项是 CRAN 上的 calendar
包(文档 here)。从 ICS 文件导入数据框只需要一行代码,创建新事件然后导出到新的 ICS 文件也很简单。