小编Amy*_*y M的帖子

从今天起减去1个月的R给出了NA

我有一个脚本,其中我根据一些设定的时间段对我的数据进行子集化,并希望对上个月发生的所有记录进行子集化.

但是,如果我尝试从今天的日期减去一个月,则会产生一个NA:

> today <- Sys.Date()
> today
[1] "2017-03-29"
> today - months(1)
[1] NA
Run Code Online (Sandbox Code Playgroud)

我确实已经加载了润滑剂,但我认为这个计算是用基数R执行的.如果我减去2个月或更多个月它可以正常工作:

> today - months(2)
[1] "2017-01-29"
> today - months(3)
[1] "2016-12-29"
Run Code Online (Sandbox Code Playgroud)

有没有人对可能发生的事情有任何想法?

更新:我认为这与简单的日期减法有关,不处理闰年案例(2017年不是闰年所以"2017-02-29"不存在).

是否有其他包装/功能考虑到闰年?对于上面的例子,我希望答案恢复到上个月的最后一天,即:

today - months(1)
# Should yield:
"2017-02-28"
Run Code Online (Sandbox Code Playgroud)

这个计算是否有意义为今天和昨天提供相同的结果(或者ISO的惯例是什么)?

> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics …
Run Code Online (Sandbox Code Playgroud)

r date subtraction lubridate calculation

7
推荐指数
2
解决办法
5235
查看次数

读取 .csv 文件时自动检测到 R 日期?

我有一大段代码,我经常运行这些代码来读入和清理 .csv 文件。清理过程的一部分是识别日期列并将它们转换为正确的格式,我用一个函数来完成(见下文)。我将日期格式设置为转换为,"%d/%m/%Y"因为这是我在 MS Excel (office 2010) 中查看时它在 .csv 文件中的显示方式。

    > convert.dates
function(data, datestring, excludestring=NULL, extradatecols=NULL, dateformat) {
  if(is.null(extradatecols)) {datecols1 <- grep(datestring, names(data), value=TRUE)} else {datecols1 <- c(grep(datestring, names(data), value=TRUE), extradatecols)}  
  if(is.null(excludestring)) {datecols2 <- datecols1} else {datecols2 <- datecols1[-grep(excludestring, datecols1)]}
  data[, datecols2] = data.frame(lapply(data[, datecols2], as.Date, format=dateformat), stringsAsFactors=FALSE)
  data
}
Run Code Online (Sandbox Code Playgroud)

我最近升级到 R 3.2.3 并将我的 R Studio 也更新到版本 0.99.489。

更新后,尽管选择了正确的格式(基于我在 .csv 文件中看到的内容),我的函数仍无法转换日期。进一步检查后,read.csv将我的日期从"%d/%m/%Y"我在 .csv 文件中观察到的格式转换为"%Y-%m-%d"并将它们存储为一个因素。然后我就能够应用我的 convert.dates 函数和"%Y-%m-%d"格式并且它起作用了。

> str(mydata$dob)
Factor w/ 3069 …
Run Code Online (Sandbox Code Playgroud)

format excel r date read.csv

5
推荐指数
0
解决办法
616
查看次数

r data.table 避免 RHS 和 LHS 之间的类差异

我有一个包含一些组的数据集,我想计算每个组中满足特定条件的记录数。然后我想将结果扩展到每个组中的其余记录(即不满足条件的地方),因为我稍后要折叠表格。

我正在使用 data.table 来执行此操作,以及.N计算每个组中满足我的条件的记录数的函数。然后我获取每个组中所有值的最大值,将结果应用于每个组中的所有记录。我的数据集非常大(将近 500 万条记录)。

我不断收到以下错误:

  Error in `[.data.table`(dpart, , `:=`(clustersize4wk, max(clustersize4wk,  : 
  Type of RHS ('double') must match LHS ('integer'). To check and coerce would impact performance too much for the fastest cases. Either change the type of the target column, or coerce the RHS of := yourself (e.g. by using 1L instead of 1)
Run Code Online (Sandbox Code Playgroud)

起初,我假设 using.N生成一个整数,而按组获取值的最大值会生成一个双精度值,但情况似乎并非如此(在下面的玩具示例中,结果列的类保持为整数),我无法重现该问题。

为了说明,这里有一个例子:

# Example data:

mydt <- data.table(id = c("a", "a", "b", "b", "b", "c", "c", "c", "c", …
Run Code Online (Sandbox Code Playgroud)

double integer r class data.table

5
推荐指数
1
解决办法
977
查看次数

r不会对从地址中提取英国邮政编码的正则表达式进行排序

我试图R中从地址字符串中提取英国的邮政编码,使用由英国政府提供的正则表达式在这里.

这是我的功能:

address_to_postcode <- function(addresses) {

  # 1. Convert addresses to upper case
  addresses = toupper(addresses)

  # 2. Regular expression for UK postcodes:
  pcd_regex = "[Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})"

  # 3. Check if a postcode is present in each address or not (return TRUE if present, else FALSE)
  present <- grepl(pcd_regex, addresses)

  # 4. Extract postcodes matching the regular expression for a valid UK postcode
  postcodes <- regmatches(addresses, regexpr(pcd_regex, addresses))

  # 5. Return NA where an address does not …
Run Code Online (Sandbox Code Playgroud)

regex r match postal-code order-of-execution

3
推荐指数
1
解决办法
1193
查看次数

使用XLConnect写入MS Excel工作表时,R NoSuchMethodError(Java)

我有一个预先格式化的Microsoft Excel工作簿,正在用作模板。然后,我想将我的data.table从R粘贴到工作簿中,使列标题和格式保持不变。

使用XLConnect软件包应该可行:

# Load library    
library(XLConnect)

# Load pre-formatted MS Excel workbook
wb <- loadWorkbook("Myworkbook.xlsx")

# Write data.table to existing worksheet excluding column names:    
writeWorksheet(wb, mydt, sheet = "Datasheet1", startRow = 3, startCol = 1, header = FALSE)

# Save the data to the workbook    
saveWorkbook(wb)
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,出现以下java错误:

Error: NoSuchMethodError (Java): org.apache.poi.ss.usermodel.Cell.setCellType(Lorg/apache/poi/ss/usermodel/CellType;)V

我正在将R版本3.4.0与带有XLConnect_0.2-13和rJava_0.9-8的RStudio版本1.0.143一起使用,在具有Microsoft Office 2010的Windows 7操作系统上,Java版本是Java 8 Update 66(64位)。

我们将不胜枚举为什么不起作用的任何想法-我可以从头开始创建工作簿和工作表,因此似乎只是将数据追加到现有工作表中就受到了影响。

java excel r xlconnect

2
推荐指数
1
解决办法
3600
查看次数

r Large data.table 为什么使用正则表达式提取单词比 stringr::word 更快?

我有一个大型 data.table,包含超过 700 万行和 38 列。其中一列是字符向量,其中包含很长的描述性句子。我知道每个句子的第一个单词是一个类别,第二个单词是一个名称,我需要将这两个单词放入两个新列中以供以后分析。

这可能不能很好地说明时间差异,因为它太小了(实际上system.time()在这个例子中给出了 0),但这里有一个玩具字符串来说明我想要做的事情:

# Load libraries:
library(data.table)
library(stringr)

# Create example character string:
x <- c("spicy apple cream", "mild peach melba", "juicy strawberry tart")
id <- c(1,2,3)

# Create dt:
mydt <- data.table(id = id, desert = x)

Run Code Online (Sandbox Code Playgroud)

假设在我的真实数据中,我想从每个字符串中提取第一个单词,并将其放入一个名为“category”的新变量中,然后从每个字符串中提取第二个单词并将其放入一个名为“fruit_name”的新变量中。

词法上最简单的方法似乎是使用stringr::word()which 很有吸引力,因为它避免了计算复杂的正则表达式的需要:

# Add a new category column:
mydt[, category := stringr::word(desert, 1)]

# Add a new fruit name column:
mydt[, fruit_name := stringr::word(desert, 2)]

Run Code Online (Sandbox Code Playgroud)

虽然这在小数据集上工作得很好,但在我的真实数据集上却花了很长时间(我怀疑它挂起了,尽管我杀死了它并在 10 分钟后重新启动了 R)。就上下文而言,该数据集中的其他字符向量类型操作大约需要 20 秒才能运行,因此该函数似乎特别耗费人力和计算资源。

相反,如果我使用正则表达式, …

performance r stringr data.table

0
推荐指数
1
解决办法
299
查看次数