我在这里跟了一些问题,询问如何将字符向量转换为datetime类.我经常看到2种方法,strptime和as.POSIXct/as.POSIXlt方法.我看了两个函数,但不清楚区别是什么.
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)
function (x, tz = "", ...)
UseMethod("as.POSIXct")
<bytecode: 0x069efeb8>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
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) 正如标题所说.为什么润滑剂的功能要慢得多?
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中使用它不赞成它会引起什么样的混乱?
我也想要一些关于如何避免的提示<<-.我经常使用以下内容.例如:
### 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的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时,问题不会出现.
引用的64位是指使用的浮点数的类型?
我是否正确地得出结论,由于可能的数字范围很大(64位FP与32位FP),使用64位MT时重复的可能性较小?
我是新手使用并行软件包并开始探索它们以加快我的一些工作.我经常遇到的烦恼是,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?
如上.数据帧是一系列整数,它们是年龄.我试图将它们转换为序数变量.代码如下.
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)
我们可以看到这不起作用.任何人都可以帮我提出一个更好的方法吗?
这是我的问题.我有一个200k行的数据集.
我想为每个测试分配一个索引.例如,对象1的第一次测试将是1,对象1的第二次测试将是2.对象2的第一次测试将是1等.
我的策略是获取唯一主题ID的列表,使用lapply将数据集子集化为使用唯一主题ID的数据帧列表,每个主题具有他/她自己的数据帧并进行测试.理想情况下,我可以对每个主题的每个数据帧进行排序,并为每个测试分配一个索引.
但是,在200k x 32的数据帧上进行此操作使我的笔记本电脑(i5,Sandy Bridge,4GB内存)很快耗尽内存.
我有两个问题:
这是生成一些虚拟数据的代码:
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) 所以我有两个数据点向量,我想列出每个唯一对的列表,以及该对的频率.我知道我可以使用表格用其中一个向量来做这个,但我似乎无法弄清楚如何用对来做它.
如上所述,任何人都知道发生了什么?
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语言中找到了一个怪癖,我不确定这是故意还是错误.
以下是一个例子:
# 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).
任何想法为什么会这样?