请考虑以下事项
$ R --vanilla
> as.Date("01 Jan 2000")
Error in charToDate(x) :
character string is not in a standard unambiguous format
Run Code Online (Sandbox Code Playgroud)
但是那个日期显然是标准的明确格式.为什么出现错误信息?
更糟糕的是,一个模棱两可的日期显然是在没有警告或错误的情况下被接受的,然后读错了!
> as.Date("01/01/2000")
[1] "0001-01-20"
Run Code Online (Sandbox Code Playgroud)
我搜索过并在包含此错误消息的[R]标签中发现了28个其他问题.所有涉及指定格式的解决方案和解决方法,iiuc.这个问题的不同之处在于,我在问无论如何定义标准的明确格式,它们可以改变吗?每个人都得到这些消息还是仅仅是我?也许它与语言环境有关?
换句话说,有没有比需要指定格式更好的解决方案?
> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252
[2] LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
Run Code Online (Sandbox Code Playgroud) 我试图在我自己的包中使用data.table包.MWE如下:
我创建了一个函数test.fun,它只是创建一个小的data.table对象,然后将"Val"列分组为"A"列.代码是
test.fun<-function ()
{
library(data.table)
testdata<-data.table(A=rep(seq(1,5), 5), Val=rnorm(25))
setkey(testdata, A)
res<-testdata[,{list(Ct=length(Val),Total=sum(Val),Avg=mean(Val))},"A"]
return(res)
}
Run Code Online (Sandbox Code Playgroud)
当我在常规R会话中创建此函数,然后运行该函数时,它按预期工作.
> res<-test.fun()
data.table 1.8.0 For help type: help("data.table")
> res
A Ct Total Avg
[1,] 1 5 -0.5326444 -0.1065289
[2,] 2 5 -4.0832062 -0.8166412
[3,] 3 5 0.9458251 0.1891650
[4,] 4 5 2.0474791 0.4094958
[5,] 5 5 2.3609443 0.4721889
Run Code Online (Sandbox Code Playgroud)
当我将此函数放入包中时,安装包,加载包,然后运行该函数,我收到一条错误消息.
> library(testpackage)
> res<-test.fun()
data.table 1.8.0 For help type: help("data.table")
Error in `[.data.frame`(x, i, j) : object 'Val' not found
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么会发生这种情况以及我可以做些什么来解决它.很感谢任何形式的帮助.
我(可能)不是指"所有其他变量",意思就像var1~.
这里一样.我plyr
再次指出并调查mlply
并想知道为什么参数是用这样的前导点定义的:
function (.data, .fun = NULL, ..., .expand = TRUE, .progress = "none",
.parallel = FALSE)
{
if (is.matrix(.data) & !is.list(.data))
.data <- .matrix_to_df(.data)
f <- splat(.fun)
alply(.data = .data, .margins = 1, .fun = f, ..., .expand = .expand,
.progress = .progress, .parallel = .parallel)
}
<environment: namespace:plyr>
Run Code Online (Sandbox Code Playgroud)
有什么用?这只是个人偏好,命名惯例还是更多?通常R是如此功能,以至于我错过了以前很久以前完成的技巧.
我试图了解如何在不使用循环的情况下条件替换数据帧中的值.我的数据框架结构如下:
> df
a b est
1 11.77000 2 0
2 10.90000 3 0
3 10.32000 2 0
4 10.96000 0 0
5 9.90600 0 0
6 10.70000 0 0
7 11.43000 1 0
8 11.41000 2 0
9 10.48512 4 0
10 11.19000 0 0
Run Code Online (Sandbox Code Playgroud)
和dput
输出是这样的:
structure(list(a = c(11.77, 10.9, 10.32, 10.96, 9.906, 10.7,
11.43, 11.41, 10.48512, 11.19), b = c(2, 3, 2, 0, 0, 0, 1, 2,
4, 0), est = c(0, 0, 0, 0, 0, …
Run Code Online (Sandbox Code Playgroud) 以下代码运行良好.只是检查:我正在使用和正确计时Pandas并且有更快的方法吗?谢谢.
$ python3
Python 3.4.0 (default, Apr 11 2014, 13:05:11)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> import numpy as np
>>> import timeit
>>> pd.__version__
'0.14.1'
def randChar(f, numGrp, N) :
things = [f%x for x in range(numGrp)]
return [things[x] for x in np.random.choice(numGrp, N)]
def randFloat(numGrp, N) :
things = [round(100*np.random.random(),4) for x in range(numGrp)]
return [things[x] for x in np.random.choice(numGrp, N)]
N=int(1e8)
K=100
DF = …
Run Code Online (Sandbox Code Playgroud) data.table引入了:=运算符.为什么不超载< - ?
我有一个模拟,有一个巨大的聚合,并在中间组合步骤.我使用plyr的ddply()函数对这个过程进行了原型设计,这对我的大部分需求非常有用.但是我需要这个聚合步骤更快,因为我必须运行10K模拟.我已经在并行缩放模拟,但如果这一步更快,我可以大大减少我需要的节点数量.
这是对我要做的事情的合理简化:
library(Hmisc)
# Set up some example data
year <- sample(1970:2008, 1e6, rep=T)
state <- sample(1:50, 1e6, rep=T)
group1 <- sample(1:6, 1e6, rep=T)
group2 <- sample(1:3, 1e6, rep=T)
myFact <- rnorm(100, 15, 1e6)
weights <- rnorm(1e6)
myDF <- data.frame(year, state, group1, group2, myFact, weights)
# this is the step I want to make faster
system.time(aggregateDF <- ddply(myDF, c("year", "state", "group1", "group2"),
function(df) wtd.mean(df$myFact, weights=df$weights)
)
)
Run Code Online (Sandbox Code Playgroud)
所有提示或建议表示赞赏!
刚刚和同事谈过这个问题,我们认为看看SO土地上的人们不得不说出来是值得的.假设我有一个包含N个元素的列表,其中每个元素都是长度为X的向量.现在假设我想将其转换为data.frame.与R中大多数事情一样,有剥皮众所周知的猫的多种方式,比如as.dataframe
,使用plyr包,comboing do.call
用cbind
,预分配的DF和填充它,和其他人.
提出的问题是当N或X(在我们的例子中是X)变得非常大时会发生什么.当效率(特别是在记忆方面)至关重要时,是否有一种猫皮肤方法显着优越?
> system.time(expand.grid(1:1000,1:10000))
user system elapsed
1.65 0.34 2.03
> system.time(CJ(1:1000,1:10000))
user system elapsed
3.48 0.32 3.79
Run Code Online (Sandbox Code Playgroud) 似乎R可能缺少一个明显的简单功能:psum
.它是以不同的名称存在,还是在某个包中?
x = c(1,3,NA,5)
y = c(2,NA,4,1)
min(x,y,na.rm=TRUE) # ok
[1] 1
max(x,y,na.rm=TRUE) # ok
[1] 5
sum(x,y,na.rm=TRUE) # ok
[1] 16
pmin(x,y,na.rm=TRUE) # ok
[1] 1 3 4 1
pmax(x,y,na.rm=TRUE) # ok
[1] 2 3 4 5
psum(x,y,na.rm=TRUE)
[1] 3 3 4 6 # expected result
Error: could not find function "psum" # actual result
Run Code Online (Sandbox Code Playgroud)
我意识到这+
已经是psum
,但是怎么样NA
?
x+y
[1] 3 NA NA 6 # can't supply `na.rm=TRUE` to `+`
Run Code Online (Sandbox Code Playgroud)
有添加的案例psum
吗?或者我错过了什么. …
r ×9
data.table ×4
performance ×3
dataframe ×2
plyr ×2
as.date ×1
coding-style ×1
colon-equals ×1
date ×1
numpy ×1
pandas ×1
python ×1
strptime ×1