我已经在各种机器上运行了一些代码测试代码,总是得到相同的结果.我认为各种do ...包背后的哲学是它们可以互换地用作foreach的%dopar%的后端.为什么不是这样?
例如,此代码段有效:
library(plyr)
library(doMC)
registerDoMC()
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE)
Run Code Online (Sandbox Code Playgroud)
虽然这些代码段中的每一个都失败了:
library(plyr)
library(doSMP)
workers <- startWorkers(2)
registerDoSMP(workers)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE)
stopWorkers(workers)
library(plyr)
library(snow)
library(doSNOW)
cl <- makeCluster(2, type = "SOCK")
registerDoSNOW(cl)
x <- data.frame(V= c("X", "Y", "X", "Y", "Z" ), Z = 1:5)
ddply(x, .(V), function(df) sum(df$Z),.parallel=TRUE)
stopCluster(cl)
library(plyr)
library(doMPI)
cl <- startMPIcluster(count = 2) …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种有效的(计算机资源方面和学习/实现方式)方法来合并两个更大的(大小> 100万/ 300 KB RData文件)数据帧.
基础R中的"merge"和plyr中的"join"似乎耗尽了我的所有内存,有效地崩溃了我的系统.
示例
负载测试数据框
并尝试
test.merged<-merge(test, test)
Run Code Online (Sandbox Code Playgroud)
要么
test.merged<-join(test, test, type="all")
Run Code Online (Sandbox Code Playgroud)
以下帖子提供了合并和备选方案的列表:
如何连接(合并)数据框(内部,外部,左侧,右侧)?
以下允许对象大小检查:https:
//heuristically.wordpress.com/2010/01/04/r-memory-usage-statistics-variable/
匿名制作的数据
我知道在这里有很多关于使用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) 我经常需要将函数应用于数据框/矩阵中的每对列,并以矩阵形式返回结果.现在我总是写一个循环来做这件事.例如,要创建一个包含相关p值的矩阵,我写道:
df <- data.frame(x=rnorm(100),y=rnorm(100),z=rnorm(100))
n <- ncol(df)
foo <- matrix(0,n,n)
for ( i in 1:n)
{
for (j in i:n)
{
foo[i,j] <- cor.test(df[,i],df[,j])$p.value
}
}
foo[lower.tri(foo)] <- t(foo)[lower.tri(foo)]
foo
[,1] [,2] [,3]
[1,] 0.0000000 0.7215071 0.5651266
[2,] 0.7215071 0.0000000 0.9019746
[3,] 0.5651266 0.9019746 0.0000000
Run Code Online (Sandbox Code Playgroud)
哪个有效,但对于非常大的矩阵来说非常慢.我可以在R中为此编写一个函数(通过假设如上所述的对称结果,不会因为切割时间减半而烦恼):
Papply <- function(x,fun)
{
n <- ncol(x)
foo <- matrix(0,n,n)
for ( i in 1:n)
{
for (j in 1:n)
{
foo[i,j] <- fun(x[,i],x[,j])
}
}
return(foo)
}
Run Code Online (Sandbox Code Playgroud)
或者是Rcpp的函数:
library("Rcpp")
library("inline")
src <-
' …Run Code Online (Sandbox Code Playgroud) 我有一个示例数据帧"数据"如下:
X Y Month Year income
2281205 228120 3 2011 1000
2281212 228121 9 2010 1100
2281213 228121 12 2010 900
2281214 228121 3 2011 9000
2281222 228122 6 2010 1111
2281223 228122 9 2010 3000
2281224 228122 12 2010 1889
2281225 228122 3 2011 778
2281243 228124 12 2010 1111
2281244 228124 3 2011 200
2281282 228128 9 2010 7889
2281283 228128 12 2010 2900
2281284 228128 3 2011 3400
2281302 228130 9 2010 1200
2281303 228130 12 2010 …Run Code Online (Sandbox Code Playgroud) R版本2.11.1在Windows 7上为32位
我有两个数据集:data_A和data_B:
USER_A USER_B ACTION
1 11 0.3
1 13 0.25
1 16 0.63
1 17 0.26
2 11 0.14
2 14 0.28
Run Code Online (Sandbox Code Playgroud)
USER_A USER_B ACTION
1 13 0.17
1 14 0.27
2 11 0.25
Run Code Online (Sandbox Code Playgroud)
现在,如果USER_A和USER_B相等,我想将data_B的ACTION添加到data_A.如上例所示,结果将是:
USER_A USER_B ACTION
1 11 0.3
1 13 0.25+0.17
1 16 0.63
1 17 0.26
2 11 0.14+0.25
2 14 0.28
Run Code Online (Sandbox Code Playgroud)
那我怎么能实现呢?
假设我有一个data.frames列表(相同的行和列)
dat1 <- as.data.frame(matrix(rnorm(25), ncol=5))
dat2 <- as.data.frame(matrix(rnorm(25), ncol=5))
dat3 <- as.data.frame(matrix(rnorm(25), ncol=5))
all.dat <- list(dat1=dat1, dat2=dat2, dat3=dat3)
Run Code Online (Sandbox Code Playgroud)
如何返回单个data.frame,它是整个列表中data.frames中每个元素的平均值(或总和等)(例如,列表1,2,3中的第一行和第一列的平均值等等)上)?我曾尝试lapply和ldply在plyr,但这些返回统计量列表中的每个data.frame.
编辑:出于某种原因,这被重新作为家庭作业.这不重要,但这不是一个功课问题.我只是不知道为什么我不能让这个工作.感谢您的任何见解!
编辑2:为了进一步说明:我可以使用循环获得结果,但我希望有一种方法(更简单,更快捷的方式,因为我使用的数据具有12行×100列的data.frames并且有一个1000多个这些数据框的列表).
z <- matrix(0, nrow(all.dat$dat1), ncol(all.dat$dat1))
for(l in 1:nrow(all.dat$dat1)){
for(m in 1:ncol(all.dat$dat1)){
z[l, m] <- mean(unlist(lapply(all.dat, `[`, i =l, j = m)))
}
}
Run Code Online (Sandbox Code Playgroud)
结果意味着:
> z
[,1] [,2] [,3] [,4] [,5]
[1,] -0.64185488 0.06220447 -0.02153806 0.83567173 0.3978507
[2,] -0.27953054 -0.19567085 0.45718399 -0.02823715 0.4932950
[3,] 0.40506666 0.95157856 1.00017954 0.57434125 -0.5969884
[4,] 0.71972821 -0.29190645 0.16257478 …Run Code Online (Sandbox Code Playgroud) 好的,快速连续的第二个R问题.
我的数据:
Timestamp St_01 St_02 ...
1 2008-02-08 00:00:00 26.020 25.840 ...
2 2008-02-08 00:10:00 25.985 25.790 ...
3 2008-02-08 00:20:00 25.930 25.765 ...
4 2008-02-08 00:30:00 25.925 25.730 ...
5 2008-02-08 00:40:00 25.975 25.695 ...
...
Run Code Online (Sandbox Code Playgroud)
基本上我通常会使用ddply和summarize计算合奏的组合(例如全年每小时的平均值).
在上面的例子中,我将创建一个类别,例如小时(例如strptime(data$Timestamp,"%H") -> data$hour,然后使用该类别ddply,比如ddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...)按每个列的类别平均.
但这里是粘性的地方.我有超过40列要处理,我不准备将它们作为参数逐个输入summarize.我曾经在shell中编写一个循环来生成这个代码,但这不是程序员如何解决问题的呢?
所以祈祷告诉,有没有人有更好的方法来实现相同的结果,但更少的击键?
我一直在寻找一个简单的并行使用ddply()的工作示例.我已经安装了"foreach"软件包,但是当我调用ddply(.parallel = TRUE)时,我收到一条警告:"没有并行后端注册"
有人可以提供一个简单的并行使用ddply的工作示例吗?
我一直在尝试通过尝试不同的变量和函数以及查看结果来了解plyr的工作原理和方式.因此,我更多地寻找有关plyr如何工作的解释,而不是特定的解决方案.我已经阅读了文档但我的新手大脑仍然没有得到它.
一些数据和名称:
mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
,c(1,2,3,10,20,30),
c(5,10,20,20,15,10))
colnames(mydf)<-c("Model", "Class","Length", "Speed")
mydf
Run Code Online (Sandbox Code Playgroud)
问题1:汇总与转换语法
所以,如果我输入: ddply(mydf, .(Model), summarise, sum = Length+Length)
我明白了:
`Model ..1
1 a 2
2 a 4
3 b 6
4 b 20
5 c 40
6 c 60
Run Code Online (Sandbox Code Playgroud)
如果我输入:ddply(mydf, .(Model), summarise, Length+Length)我得到相同的结果.
现在如果使用转换: ddply(mydf, .(Model), transform, sum = (Length+Length))
我明白了:
Model Class Length Speed sum
1 a e 1 5 2
2 a e 2 10 4
3 b e 3 20 6
4 b e 10 …Run Code Online (Sandbox Code Playgroud)