我开始在R中使用data.table包来提高代码的性能.我使用以下代码:
sp500 <- read.csv('../rawdata/GMTSP.csv')
days <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
# Using data.table to get the things much much faster
sp500 <- data.table(sp500, key="Date")
sp500 <- sp500[,Date:=as.Date(Date, "%m/%d/%Y")]
sp500 <- sp500[,Weekday:=factor(weekdays(sp500[,Date]), levels=days, ordered=T)]
sp500 <- sp500[,Year:=(as.POSIXlt(Date)$year+1900)]
sp500 <- sp500[,Month:=(as.POSIXlt(Date)$mon+1)]
Run Code Online (Sandbox Code Playgroud)
我注意到as.Date函数完成的转换非常慢,与其他创建工作日的函数相比,等等.为什么会这样?是否有更好/更快的解决方案,如何转换为日期格式?(如果你问我是否真的需要日期格式,可能是的,因为然后使用ggplot2制作情节,这就像这种类型数据的魅力一样.)
更确切地说
> system.time(sp500 <- sp500[,Date:=as.Date(Date, "%m/%d/%Y")])
user system elapsed
92.603 0.289 93.014
> system.time(sp500 <- sp500[,Weekday:=factor(weekdays(sp500[,Date]), levels=days, ordered=T)])
user system elapsed
1.938 0.062 2.001
> system.time(sp500 <- sp500[,Year:=(as.POSIXlt(Date)$year+1900)])
user system elapsed
0.304 0.001 0.305
Run Code Online (Sandbox Code Playgroud)
在MacAir i5上,观测值略低于3000000.
谢谢
raw
是data.table
和以下代码一起工作:
raw[,r_responseTime] #Returns the whole column
raw[,c_filesetSize] #Same as above, returns column
plot(raw[,r_responseTime]~raw[,c_filesetSize]) #draws something
Run Code Online (Sandbox Code Playgroud)
现在我想从字符串中指定这些列,例如:
col1="r_reponseTime"
col2="c_filesetSize"
Run Code Online (Sandbox Code Playgroud)
现在,如何通过字符串引用列来实现与上面相同的功能?
raw[,col1] #Returns the whole column
raw[,col2] #Same as above, returns column
plot(raw[,col1]~raw[,col2]) #draws something
Run Code Online (Sandbox Code Playgroud)
不起作用,当然因为我需要某种"解除歧视".我不知道在帮助和互联网上搜索什么,很抱歉这个愚蠢的问题.
我遇到了一些困扰我的问题...希望这里的任何人都可以帮助我.
我得到了以下数据框
f <- c('a','a','b','b','b','c','d','d','d','d')
v1 <- c(1.3,10,2,10,10,1.1,10,3.1,10,10)
v2 <- c(1:10)
df <- data.frame(f,v1,v2)
Run Code Online (Sandbox Code Playgroud)
f是一个因素; v1和v2是值.对于f的每个级别,我只想要保留一行:在此因子级别中具有最低值v1的行.
f v1 v2
a 1.3 1
b 2 3
c 1.1 6
d 3.1 8
Run Code Online (Sandbox Code Playgroud)
我用聚合,ddply,by,tapply尝试了各种各样的东西......但似乎没有任何效果.对于任何建议,我将非常感激.
我知道在这里有很多关于使用do.call或ldply将data.frames列表转换为单个data.frame的方法,但这个问题是关于理解两种方法的内部工作方式并试图找出原因我无法将两个相同结构,相同字段名称等近100万个df的列表连接到一个data.frame中.每个data.frame都是一行和21列.
数据以JSON文件开头,我使用fromJSON转换为列表,然后运行另一个lapply来提取列表的一部分并转换为data.frame,最后得到一个data.frames列表.
我试过了:
df <- do.call("rbind", list)
df <- ldply(list)
Run Code Online (Sandbox Code Playgroud)
但我不得不在让它运行3个小时并且没有得到任何回报之后终止这个过程.
有更有效的方法吗?我怎样才能解决正在发生的事情以及为什么需要这么长时间?
仅供参考 - 我在使用RHEL的72GB四核服务器上使用RStudio服务器,所以我认为内存不是问题所在.sessionInfo如下:
> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-redhat-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] multicore_0.1-7 plyr_1.7.1 rjson_0.2.6
loaded via a namespace (and not attached):
[1] tools_2.14.1
>
Run Code Online (Sandbox Code Playgroud) 这可能是一个简单的问题,但我仍然需要一些帮助使用R.
我有一个data.frame(main_data),让我们说..
NAMES AGE LOC
Jyo 23 Hyd
Abid 27 Kar
Ras 24 Pun
Poo 25 Goa
Sus 28 Kar
Run Code Online (Sandbox Code Playgroud)
我希望根据名称列表删除几行.所以我可以说我有另一个表列表如下:
NAMES_list
Jyo
Ras
Poo
Run Code Online (Sandbox Code Playgroud)
所以基于这个列表,如果任何名称与我上面的"main_data"表匹配,那么我想删除它们的整行,所以结果应该如下
NAMES AGE LOC
Abid 27 Kar
Sus 28 Kar
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决这个问题吗?提前致谢.. :)
为了向现有的空data.table(版本1.8.6)添加新列,没有被警告似乎没有办法做到这一点.
例:
dt<-old.table[0]
dt[,new_column:=""]
Run Code Online (Sandbox Code Playgroud)
这会产生警告:
In '[.data.table'(dt, , ':='(new_column,"")):
Supplied 1 items to be assigned to 0 items of column 'new_column' (1 unused)
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有警告的情况下添加新列?
我创建了小数据表DT = data.table(a=1:2, a=1:2)
.
如果我使用 names(DT) <- c("b","b")
我收到警告
In `names<-.data.table`(`*tmp*`, value = c("b", "b")) :
The names(x)<-value syntax copies the whole table. This is due to <- in R itself. Please change to setnames(x,old,new) which does not copy and is faster. See help('setnames'). You can safely ignore this warning if it is inconvenient to change right now. Setting options(warn=2) turns this warning into an error, so you can then use traceback() to find and change your names<- …
Run Code Online (Sandbox Code Playgroud) 我有一个大的R脚本,比方说,142个小部分.如果一个部分失败并出现错误,我希望脚本继续而不是停止.这些部分不一定相互依赖,但有些部分相互依赖.如果中间的一个失败那没关系.我宁愿不try()
打电话给这个剧本.而且我不希望将文件拆分成许多较小的文件,因为每个部分都很短.
如果source()
可以像在R控制台上复制和粘贴一样工作,那就太好了.或者如果有办法将错误降级为警告,那也没关系.
一旦脚本运行,我打算grep(或类似)输出错误或警告文本,以便我可以看到已发生的所有错误或警告,而不仅仅是它已在第一个错误上停止.
我已经阅读?source
并搜索了Stack Overflow的[R]标签.我发现下面类似的问题,但try
与tryCatch
人的答案提供:
R脚本 - 如何在出错时继续执行代码
在收到错误消息而不是暂停执行后,是否有任何方法让R脚本继续?
我不是在寻找try
或tryCatch
出于上述原因.这不适用于R包测试,我知道测试框架以及许多try()
或test_that()
调用(或类似)完全合适的地方.这是我所描述的脚本的其他内容.
谢谢!
我有一个data.frame
拥有1900万行和90列的R.我有足够的备用RAM和CPU周期.似乎在此数据框中更改单个列名称对于R来说是一个非常激烈的操作.
system.time(colnames(my.df)[1] <- "foo")
user system elapsed
356.88 16.54 373.39
Run Code Online (Sandbox Code Playgroud)
为什么会这样?每行都以某种方式存储列名吗?这会创建一个全新的数据框吗?看来这个操作应该在微不足道的时间内完成.我在R手册中没有看到任何明显的东西.
我正在Windows 7上运行构建7600的R(64位),在我当前的工作区中,在一个小数据上设置colnames.frame需要'0'时间system.time()
.
编辑:我知道使用的可能性data.table
,老实说,我可以等5分钟完成重命名,同时我去喝茶.我感兴趣的是发生了什么以及为什么?
作为我的数据集的一部分,其中一列是一系列24位数字.
例:
bigonumber <- 429382748394831049284934
Run Code Online (Sandbox Code Playgroud)
当我导入它使用任一data.table::fread
或read.csv
,它显示为在指数格式数字(EG:4.293827e + 23).
options(digits=...)
由于该数字超过22位,因此无效.
当我做
as.character(bigonumber)
Run Code Online (Sandbox Code Playgroud)
我得到的是"4.29382748394831e + 23"
有没有办法bigonumber
转换为字符串并将所有数字显示为字符?我不需要对它进行任何数学计算,但我确实需要搜索它并dplyr
加入它.
导入后我需要这个,因为列号因月而异.
(是的,在完美的世界中,我的上游数据提供者会使用哈希而不是长数和静态列数,每个月都保持相同,但我不能指示它们.)