小编RJ-*_*RJ-的帖子

用于将字符向量转换为POSIXct/POSIXlt的as.POSIXct/as.POSIXlt和strptime之间的区别

我在这里跟了一些问题,询问如何将字符向量转换为datetime类.我经常看到2种方法,strptime和as.POSIXct/as.POSIXlt方法.我看了两个函数,但不清楚区别是什么.

strptime

function (x, format, tz = "") 
{
    y <- .Internal(strptime(as.character(x), format, tz))
    names(y$year) <- names(x)
    y
}
<bytecode: 0x045fcea8>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)

as.POSIXct

function (x, tz = "", ...) 
UseMethod("as.POSIXct")
<bytecode: 0x069efeb8>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)

as.POSIXlt

function (x, tz = "", ...) 
UseMethod("as.POSIXlt")
<bytecode: 0x03ac029c>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)

做一个微基准测试,看看是否存在性能差异:

library(microbenchmark)
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 5000, replace = TRUE)
df <- microbenchmark(strptime(Dates, "%d-%m-%Y"), as.POSIXlt(Dates, format = "%d-%m-%Y"), times = 1000)

Unit: milliseconds
                                    expr      min       lq   median       uq      max …
Run Code Online (Sandbox Code Playgroud)

time benchmarking r date

89
推荐指数
2
解决办法
5万
查看次数

与as.POSIXct相比,为什么lubridate函数如此慢?

正如标题所说.为什么润滑剂的功能要慢得多?

library(lubridate)
library(microbenchmark)

Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 50000, replace = TRUE)

microbenchmark(as.POSIXct(Dates, format = "%d-%b-%Y %H:%M:%S", tz = "GMT"), times = 100)
microbenchmark(dmy(Dates, tz ="GMT"), times = 100)

Unit: milliseconds
expr                                                            min         lq          median      uq          max
1 as.POSIXct(Dates, format = "%d-%b-%Y %H:%M:%S", tz = "GMT")   103.1902    104.3247    108.675     109.2632    149.871
2 dmy(Dates, tz = "GMT")                                        184.4871    194.1504    197.8422    214.3771    268.4911
Run Code Online (Sandbox Code Playgroud)

r lubridate

22
推荐指数
2
解决办法
3217
查看次数

为什么使用"<< - "不赞成,我该如何避免呢?

我跟着这里的讨论,很好奇为什么<<-在R中使用它不赞成它会引起什么样的混乱?

我也想要一些关于如何避免的提示<<-.我经常使用以下内容.例如:

### Create dummy data frame of 10 x 10 integer matrix.
### Each cell contains a number that is between 1 to 6.
df <- do.call("rbind", lapply(1:10, function(i) sample(1:6, 10, replace = TRUE)))
Run Code Online (Sandbox Code Playgroud)

我想要实现的是将每个数字减少1,即所有2s将变为1,所有3将变为2等等.因此,一切n都会到来n-1.我通过以下方式实现这一目标:

df.rescaled <- df
sapply(2:6, function(i) df.rescaled[df.rescaled == i] <<- i-1))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我该如何避免<<-?理想情况下,我希望能够将sapply结果传递到另一个变量:

df.rescaled <- sapply(...)
Run Code Online (Sandbox Code Playgroud)

r

9
推荐指数
2
解决办法
821
查看次数

R随机数发生器故障?

我正在研究基础R的RNG,并且很奇怪Mersenne-Twister的32位实现可能会在缩放到需要的大量随机数时限制它,所以我做了一个简单的测试:

set.seed(8)
length(unique(runif(1e8)))
# [1] 98845641
1e8 - 98845641
# 1154359
Run Code Online (Sandbox Code Playgroud)

事实证明,在1亿平局中确实存在许多重复.

当我切换到由dqrng包实现的64位版本的MT RNG时,问题不会出现.

问题1:

引用的64位是指使用的浮点数的类型?

问题2:

我是否正确地得出结论,由于可能的数字范围很大(64位FP与32位FP),使用64位MT时重复的可能性较小?

random r

8
推荐指数
1
解决办法
132
查看次数

事先了解clusterExport的对象

我是新手使用并行软件包并开始探索它们以加快我的一些工作.我经常遇到的烦恼是,foreach当我没有clusterExport相关的函数/变量时,命令会抛出问题.

我知道下面的例子并不一定foreach要让它快速,但为了便于说明,我将使用它.

library(doParallel)
library(parallel)
library(lubridate)
library(foreach)

cl <- makeCluster(c("localhost", "localhost", "localhost","localhost"), type = "SOCK")
registerDoParallel(cl, cores = 4)

Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 500, replace = TRUE)

foreach(i = seq_along(Dates), .combine = rbind) %dopar% dmy(Dates[i])

Error in dmy(Dates[i]) : task 1 failed - "could not find function "dmy""
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个错误表明dmy找不到该功能.然后我必须继续添加以下内容:

clusterExport(cl, c("dmy"))
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,除了查看错误以寻找导出内容的线索之外,是否有一种更优雅的方式可以事先知道要导出哪些对象,或者有没有办法在运行之前与所有从属设备共享全局环境foreach

parallel-processing foreach r

7
推荐指数
1
解决办法
2589
查看次数

用因子替换范围内的数字

如上.数据帧是一系列整数,它们是年龄.我试图将它们转换为序数变量.代码如下.

df <- read.table("http://dl.dropbox.com/u/822467/df.csv", header = TRUE, sep = ",")

df[(df >= 0)  & (df <= 14)] <- "Age1"
df[(df >= 15) & (df <= 44)] <- "Age2"
df[(df >= 45) & (df <= 64)] <- "Age3"
df[(df > 64)] <- "Age4"

table(df)
Run Code Online (Sandbox Code Playgroud)

我们可以看到这不起作用.任何人都可以帮我提出一个更好的方法吗?

r data-processing r-factor

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

将字符串列表分解为分区

这是我的问题.我有一个200k行的数据集.

  • 每行对应于对受试者进行的测试.
  • 受试者的测试数量不等.
  • 每个测试都是过时的.

我想为每个测试分配一个索引.例如,对象1的第一次测试将是1,对象1的第二次测试将是2.对象2的第一次测试将是1等.

我的策略是获取唯一主题ID的列表,使用lapply将数据集子集化为使用唯一主题ID的数据帧列表,每个主题具有他/她自己的数据帧并进行测试.理想情况下,我可以对每个主题的每个数据帧进行排序,并为每个测试分配一个索引.

但是,在200k x 32的数据帧上进行此操作使我的笔记本电脑(i5,Sandy Bridge,4GB内存)很快耗尽内存.

我有两个问题:

  1. 有一个更好的方法吗?
  2. 如果没有,我唯一的选择是克服内存限制是将我的唯一SubjectID列表分解为更小的集合,例如每个列表1000个SubjectID,通过数据集提供它,并在所有内容的末尾将列表连接在一起.然后,如何创建一个函数来打破我的SubjectID列表,方法是提供一个表示分区数的整数.例如,BreakPartition(数据集,5)将数据集分成5个分区.

这是生成一些虚拟数据的代码:

UniqueSubjectID <- sapply(1:500, function(i) paste(letters[sample(1:26, 5, replace = TRUE)], collapse =""))
UniqueSubjectID <- subset(UniqueSubjectID, !duplicated(UniqueSubjectID))
Dataset <- data.frame(SubID = sample(sapply(1:500, function(i) paste(letters[sample(1:26, 5, replace = TRUE)], collapse ="")),5000, replace = TRUE))
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d.%m.%Y')), 5000, replace = TRUE)
Dataset <- cbind(Dataset, Dates)
Run Code Online (Sandbox Code Playgroud)

r subset plyr data.table

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

如何列出R中所有唯一的数据点对?

所以我有两个数据点向量,我想列出每个唯一对的列表,以及该对的频率.我知道我可以使用表格用其中一个向量来做这个,但我似乎无法弄清楚如何用对来做它.

r unique frequency

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

"意思是"没有正确答案

如上所述,任何人都知道发生了什么?

m1 <- 0.457842055395572
m2 <- 0.587127416942505
sum(m1, m2)/2
mean(m1, m2)
Run Code Online (Sandbox Code Playgroud)

输出:

> m1 <- 0.457842055395572
> m2 <- 0.587127416942505
> sum(m1, m2)/2
[1] 0.5224847
> mean(m1, m2)
[1] 0.4578421
Run Code Online (Sandbox Code Playgroud)

重启R仍然是一样的.我在R 3.0 x86 Windows上.

r mean

4
推荐指数
1
解决办法
130
查看次数

函数内的变量赋值

我最近在R语言中找到了一个怪癖,我不确定这是故意还是错误.

以下是一个例子:

# Simple print function
print.func <- function(n) {print(n)}

# Test it out
print.func(1:10)
[1]  1  2  3  4  5  6  7  8  9 10

# However, if we wrap an assignment into the function
print.func(a <- 1:10)
Run Code Online (Sandbox Code Playgroud)

我不明白的是,在print.func所有分配中,所有分配都应该局限于本地功能环境,但在这种情况下,a在全局环境中分配.

只有当我们做类似的事情时,我才会期待这种行为print.func(a <<- 1:10).

任何想法为什么会这样?

r variable-assignment

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