相关疑难解决方法(0)

诀窍来管理R会话中的可用内存

人们用什么技巧来管理交互式R会话的可用内存?我使用下面的函数[根据Petr Pikal和David Hinds在2004年的r-help列表中的帖子]列出(和/或排序)最大的对象,偶尔列出rm()其中的一些.但到目前为止,最有效的解决方案是在具有充足内存的64位Linux下运行.

人们想分享其他任何好玩的伎俩吗?请发一个帖子.

# improved list of objects
.ls.objects <- function (pos = 1, pattern, order.by,
                        decreasing=FALSE, head=FALSE, n=5) {
    napply <- function(names, fn) sapply(names, function(x)
                                         fn(get(x, pos = pos)))
    names <- ls(pos = pos, pattern = pattern)
    obj.class <- napply(names, function(x) as.character(class(x))[1])
    obj.mode <- napply(names, mode)
    obj.type <- ifelse(is.na(obj.class), obj.mode, obj.class)
    obj.size <- napply(names, object.size)
    obj.dim <- t(napply(names, function(x)
                        as.numeric(dim(x))[1:2]))
    vec <- is.na(obj.dim)[, 1] & (obj.type != "function")
    obj.dim[vec, 1] <- napply(names, length)[vec]
    out <- data.frame(obj.type, …
Run Code Online (Sandbox Code Playgroud)

memory-management r

480
推荐指数
19
解决办法
10万
查看次数

为什么pandas在python中的合并速度比2012年R中的data.table合并更快?

我最近遇到了python 的pandas库,根据这个基准测试执行非常快速的内存中合并.它甚至比R中的data.table包更快(我选择用于分析的语言).

为什么pandas这么快data.table?是因为python具有超过R的固有速度优势,还是有一些我不知道的权衡?有没有办法在data.table不诉诸merge(X, Y, all=FALSE)和执行内部和外部联接的情况下merge(X, Y, all=TRUE)

对照

这是用于对各种包进行基准测试的R代码Python代码.

python join r pandas data.table

156
推荐指数
4
解决办法
2万
查看次数

有条件地替换data.frame中的值

我试图了解如何在不使用循环的情况下条件替换数据帧中的值.我的数据框架结构如下:

> 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)

r dataframe

65
推荐指数
5
解决办法
16万
查看次数

44
推荐指数
2
解决办法
4259
查看次数

R自我参考

在RI中发现自己做了很多这样的事情:

adataframe[adataframe$col==something]<-adataframe[adataframe$col==something)]+1

这种方式有点冗长乏味.有没有办法让我
引用我想要改变的对象,比如

adataframe[adataframe$col==something]<-$self+1 
Run Code Online (Sandbox Code Playgroud)

r dataframe self-reference

37
推荐指数
4
解决办法
2803
查看次数

修改大R data.frame时内存不足

我有一个大数据框架需要大约900MB内存.然后我试着像这样修改它:

dataframe[[17]][37544]=0 
Run Code Online (Sandbox Code Playgroud)

似乎让R使用超过3G ram而R抱怨"错误:无法分配大小为3.0 Mb的矢量",(我在32位机器上.)

我发现这种方式更好:

dataframe[37544, 17]=0
Run Code Online (Sandbox Code Playgroud)

但R的占地面积仍然翻了一番,命令需要相当长的时间才能运行.

从C/C++背景来看,我对这种行为感到很困惑.我认为dataframe[37544, 17]=0应该在眨眼间完成,而不花费任何额外的内存(只应修改一个单元格).R对我发布的那些命令做了什么?在不增加内存占用量的情况下,修改数据框中某些元素的正确方法是什么?

非常感谢你的帮助!

r dataframe

11
推荐指数
3
解决办法
2687
查看次数

使用 foreach 和 %dopar% 将列添加到数据框

在 Windows 7 和 Ubuntu 64 位 11.04 上的 Revolution R 2.12.2 中,我有一个超过 100K 行和 100 多列的数据框,并且我为每个原始列派生了 ~5 列(sqrt、log、log10 等)并将它们添加到同一个数据框中。如果没有使用 foreach 和 %do% 的并行性,这可以正常工作,但速度很慢。当我尝试将它与 foreach 和 %dopar% 并行化时,它不会访问全局环境(以防止竞争条件或类似情况),因此我无法修改数据框,因为“未找到”数据框对象。

我的问题是我怎样才能让它更快?换句话说,如何并行化列或转换?

简化示例:

require(foreach)    
require(doSMP)
w <- startWorkers()
registerDoSMP(w)

transform_features <- function()
{    
    cols<-c(1,2,3,4) # in my real code I select certain columns (not all)

    foreach(thiscol=cols, mydata) %dopar% { 
        name <- names(mydata)[thiscol]
        print(paste('transforming variable ', name))
        mydata[,paste(name, 'sqrt', sep='_')] <<- sqrt(mydata[,thiscol])
            mydata[,paste(name, 'log', sep='_')] <<- log(mydata[,thiscol])
    }
}


n<-10 # I …
Run Code Online (Sandbox Code Playgroud)

parallel-processing performance foreach r

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

基于列和行在R中合并

对于示例数据框:

survey <- structure(list(id = 1:10, cntry = structure(c(2L, 3L, 1L, 2L, 
2L, 3L, 1L, 1L, 3L, 2L), .Label = c("DE", "FR", "UK"), class = "factor"), 
    age.cat = structure(c(1L, 1L, 2L, 4L, 1L, 3L, 4L, 4L, 1L, 
    2L), .Label = c("Y_15.24", "Y_40.54", "Y_55.plus", "Y_less.15"
    ), class = "factor")), .Names = c("id", "cntry", "age.cat"
), class = "data.frame", row.names = c(NA, -10L))
Run Code Online (Sandbox Code Playgroud)

我想添加一个名为'age.cat'的额外列,该列由另一个数据帧填充:

age.cat <- structure(list(cntry = structure(c(2L, 3L, 1L), .Label = c("DE", 
    "FR", "UK"), class = "factor"), Y_less.15 = c(0.2, …
Run Code Online (Sandbox Code Playgroud)

merge r dataframe

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